mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-26 14:31:02 -04:00
better support for high dpi screens
This commit is contained in:
parent
c1c9130c4f
commit
5ebb5a435d
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
92
src/main/java/de/neemann/gui/Screen.java
Normal file
92
src/main/java/de/neemann/gui/Screen.java
Normal 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));
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user