diff --git a/src/main/java/de/neemann/digital/draw/elements/VisualElement.java b/src/main/java/de/neemann/digital/draw/elements/VisualElement.java index 3fa53136f..ec54d2634 100644 --- a/src/main/java/de/neemann/digital/draw/elements/VisualElement.java +++ b/src/main/java/de/neemann/digital/draw/elements/VisualElement.java @@ -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); } diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 94f1c4e38..a7732091a 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -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); } diff --git a/src/main/java/de/neemann/digital/gui/components/DataEditor.java b/src/main/java/de/neemann/digital/gui/components/DataEditor.java index 12d68d241..0bfe95752 100644 --- a/src/main/java/de/neemann/digital/gui/components/DataEditor.java +++ b/src/main/java/de/neemann/digital/gui/components/DataEditor.java @@ -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; diff --git a/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java b/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java index 7618c5856..548ed0bc3 100644 --- a/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java @@ -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); diff --git a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java index 65c70c67c..eb122f370 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java @@ -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 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)); diff --git a/src/main/java/de/neemann/digital/gui/components/testing/TestDataDialog.java b/src/main/java/de/neemann/digital/gui/components/testing/TestDataDialog.java index 2a411caf1..a11fc17c0 100644 --- a/src/main/java/de/neemann/digital/gui/components/testing/TestDataDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/testing/TestDataDialog.java @@ -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); diff --git a/src/main/java/de/neemann/digital/gui/components/testing/TestResultDialog.java b/src/main/java/de/neemann/digital/gui/components/testing/TestResultDialog.java index 090222635..186a98e7b 100644 --- a/src/main/java/de/neemann/digital/gui/components/testing/TestResultDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/testing/TestResultDialog.java @@ -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; diff --git a/src/main/java/de/neemann/gui/IconCreator.java b/src/main/java/de/neemann/gui/IconCreator.java index d0cd5fe2c..b324b85b6 100644 --- a/src/main/java/de/neemann/gui/IconCreator.java +++ b/src/main/java/de/neemann/gui/IconCreator.java @@ -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; } - } diff --git a/src/main/java/de/neemann/gui/Screen.java b/src/main/java/de/neemann/gui/Screen.java new file mode 100644 index 000000000..735dc8fdb --- /dev/null +++ b/src/main/java/de/neemann/gui/Screen.java @@ -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)); + } + +}