better support for high dpi screens

This commit is contained in:
hneemann 2017-05-09 14:16:00 +02:00
parent c1c9130c4f
commit 5ebb5a435d
9 changed files with 116 additions and 8 deletions

View File

@ -7,6 +7,7 @@ import de.neemann.digital.draw.shapes.*;
import de.neemann.digital.draw.shapes.Shape;
import de.neemann.digital.gui.components.CircuitComponent;
import de.neemann.digital.gui.sync.Sync;
import de.neemann.gui.Screen;
import javax.swing.*;
import java.awt.*;
@ -230,7 +231,8 @@ public class VisualElement implements Drawable, Movable, AttributeListener {
* @return the created icon
*/
public ImageIcon createIcon(int maxHeight) {
BufferedImage bi = getBufferedImage(0.5, maxHeight);
float scaling = Screen.getInstance().getScaling();
BufferedImage bi = getBufferedImage(0.5 * scaling, (int) (maxHeight * scaling));
return new ImageIcon(bi);
}

View File

@ -234,7 +234,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
}
}.setToolTip(Lang.get("menu_help_elements_tt")).createJMenuItem());
setPreferredSize(new Dimension(1024, 768));
setPreferredSize(Screen.getInstance().scale(new Dimension(1024, 768)));
pack();
setLocationRelativeTo(builder.parent);
}

View File

@ -52,6 +52,7 @@ public class DataEditor extends JDialog {
MyTableModel dm = new MyTableModel(this.localDataField, cols, modelSync);
JTable table = new JTable(dm);
table.setDefaultRenderer(MyLong.class, new MyLongRenderer(bits));
table.setRowHeight(table.getFont().getSize() * 6 / 5);
getContentPane().add(new JScrollPane(table));
int minWidth = 0;

View File

@ -50,6 +50,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserver {
tableModel = new SignalTableModel(signals);
JTable list = new JTable(tableModel);
list.setRowHeight(list.getFont().getSize() * 6 / 5);
getContentPane().add(new JScrollPane(list), BorderLayout.CENTER);
setAlwaysOnTop(true);

View File

@ -38,6 +38,7 @@ import de.neemann.digital.gui.components.AttributeDialog;
import de.neemann.digital.gui.components.ElementOrderer;
import de.neemann.digital.lang.Lang;
import de.neemann.gui.ErrorMessage;
import de.neemann.gui.Screen;
import de.neemann.gui.ToolTipAction;
import javax.swing.*;
@ -99,13 +100,13 @@ public class TableDialog extends JDialog {
label = new JLabel();
font = label.getFont().deriveFont(20.0f);
font = Screen.getInstance().getFont(1.66f);
label.setFont(font);
table = new JTable(model);
JComboBox<String> comboBox = new JComboBox<>(TruthTableTableModel.STATENAMES);
table.setDefaultEditor(Integer.class, new DefaultCellEditor(comboBox));
table.setDefaultRenderer(Integer.class, new CenterDefaultTableCellRenderer());
table.setRowHeight(25);
table.setRowHeight(font.getSize() * 6 / 5);
table.getInputMap().put(KeyStroke.getKeyStroke("0"), "0_ACTION");
table.getActionMap().put("0_ACTION", new SetAction(0));

View File

@ -11,6 +11,7 @@ import de.neemann.digital.testing.TestData;
import de.neemann.digital.testing.Transitions;
import de.neemann.digital.testing.parser.ParserException;
import de.neemann.gui.ErrorMessage;
import de.neemann.gui.Screen;
import de.neemann.gui.ToolTipAction;
import javax.swing.*;
@ -51,7 +52,7 @@ public class TestDataDialog extends JDialog {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JTextArea text = new JTextArea(data.getDataString(), 30, 50);
text.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
text.setFont(new Font(Font.MONOSPACED, Font.PLAIN, (int) Screen.getInstance().getFontSize()));
JScrollPane scrollPane = new JScrollPane(text);
getContentPane().add(scrollPane);

View File

@ -62,7 +62,9 @@ public class TestResultDialog extends JDialog {
JTable table = new JTable(new TestResultModel(tr));
table.setDefaultRenderer(MatchedValue.class, new MatchedValueRenderer());
table.setDefaultRenderer(Integer.class, new NumberRenderer());
table.getColumnModel().getColumn(0).setMaxWidth(40);
final Font font = table.getFont();
table.getColumnModel().getColumn(0).setMaxWidth(font.getSize()*4);
table.setRowHeight(font.getSize() * 6 / 5);
String tabName;
Icon tabIcon;

View File

@ -3,6 +3,7 @@ package de.neemann.gui;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
@ -38,7 +39,15 @@ public final class IconCreator {
if (systemResource == null) {
throw new NullPointerException("recource " + name + " not found!");
}
return ImageIO.read(systemResource);
BufferedImage image = ImageIO.read(systemResource);
final float scaling = Screen.getInstance().getScaling();
if (scaling != 1) {
int w = (int) (image.getWidth() * scaling);
int h = (int) (image.getHeight() * scaling);
return image.getScaledInstance(w, h, BufferedImage.SCALE_SMOOTH);
} else
return image;
} catch (IOException e) {
throw new RuntimeException("Image " + name + " not found");
}
@ -57,5 +66,4 @@ public final class IconCreator {
}
return list;
}
}

View File

@ -0,0 +1,92 @@
package de.neemann.gui;
import javax.swing.*;
import java.awt.*;
/**
* Class used to handle diifferent screen resolution by defining a new default font
* used by the GUI components.
* Created by hneemann on 09.05.17.
*/
public final class Screen {
private static final class InstanceHolder {
private static Screen instance = new Screen();
}
private final float size;
private final float scaling;
private final Font font;
/**
* @return the Screen instance
*/
public static Screen getInstance() {
return InstanceHolder.instance;
}
private Screen() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
float s = screenSize.height / 90f;
Font font = new JLabel().getFont();
if (s > 12) {
font = font.deriveFont(s);
for (Object key : javax.swing.UIManager.getLookAndFeel().getDefaults().keySet()) {
if (key.toString().endsWith(".font"))
javax.swing.UIManager.put(key, font);
}
scaling = s / 12;
size = s;
UIManager.put("ScrollBar.width", (int) (size * 17 / 12));
} else {
scaling = 1;
size = 12;
}
this.font = font;
}
/**
* @return font size
*/
public float getFontSize() {
return size;
}
/**
* @return the font
*/
public Font getFont() {
return font;
}
/**
* Get scaled font
*
* @param scale the scaling factor
* @return the scaled font
*/
public Font getFont(float scale) {
return font.deriveFont(font.getSize2D() * scale);
}
/**
* @return the scaling
*/
public float getScaling() {
return scaling;
}
/**
* Scales the given dimension
*
* @param dimension the given dimension
* @return the scaled dimension
*/
public Dimension scale(Dimension dimension) {
if (scaling == 1)
return dimension;
else
return new Dimension((int) (dimension.width * scaling), (int) (dimension.height * scaling));
}
}