OSDN Git Service

Java8環境における、高解像度スクリーンのスケール対応
authorseraphy <seraphy@users.osdn.me>
Sun, 30 Dec 2018 15:57:56 +0000 (00:57 +0900)
committerseraphy <seraphy@users.osdn.me>
Sun, 30 Dec 2018 15:57:56 +0000 (00:57 +0900)
19 files changed:
src/main/java/charactermanaj/Main.java
src/main/java/charactermanaj/ui/AboutBox.java
src/main/java/charactermanaj/ui/AppConfigDialog.java
src/main/java/charactermanaj/ui/ExportWizardDialog.java
src/main/java/charactermanaj/ui/ImageSelectPanel.java
src/main/java/charactermanaj/ui/ImportWizardDialog.java
src/main/java/charactermanaj/ui/InformationDialog.java
src/main/java/charactermanaj/ui/LayerOrderCustomizeDialog.java
src/main/java/charactermanaj/ui/MainFrame.java
src/main/java/charactermanaj/ui/ManageFavoriteDialog.java
src/main/java/charactermanaj/ui/PartsManageDialog.java
src/main/java/charactermanaj/ui/ProfileEditDialog.java
src/main/java/charactermanaj/ui/ProfileSelectorDialog.java
src/main/java/charactermanaj/ui/SearchPartsDialog.java
src/main/java/charactermanaj/ui/SelectCharatersDirDialog.java
src/main/java/charactermanaj/ui/UkagakaConvertDialog.java
src/main/java/charactermanaj/ui/WallpaperDialog.java
src/main/java/charactermanaj/ui/util/ScaleSupport.java [new file with mode: 0644]
src/main/java/charactermanaj/util/ErrorMessageHelper.java

index 52a0663..4e468e8 100644 (file)
@@ -30,6 +30,7 @@ import charactermanaj.ui.MainFramePartialForMacOSX;
 import charactermanaj.ui.MainFramePartialForMacOSX9;
 import charactermanaj.ui.ProfileListManager;
 import charactermanaj.ui.SelectCharatersDirDialog;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.AWTExceptionLoggingHandler;
 import charactermanaj.util.ApplicationLoggerConfigurator;
 import charactermanaj.util.ConfigurationDirUtilities;
@@ -237,6 +238,12 @@ public final class Main implements Runnable {
                // デフォルトのフォントサイズ、0以下の場合はシステム標準のまま
                int defFontSize = appConfig.getDefaultFontSize();
 
+               // フォントサイズを画面のスケールの補正にあわせる
+               if (defFontSize > 0) {
+                       ScaleSupport scaleSupport = ScaleSupport.getDefault();
+                       defFontSize = (int)(defFontSize * scaleSupport.getManualScaleY());
+               }
+
                // UIデフォルトのフォント設定で、優先フォント以外のフォントファミリが指定されているものを
                // すべて最優先フォントファミリに設定する.
                // また、設定されたフォントサイズが0よりも大きければ、そのサイズに設定する.
index 853799b..4f3b964 100644 (file)
@@ -36,6 +36,7 @@ import javax.swing.text.Document;
 import javax.swing.text.EditorKit;
 
 import charactermanaj.model.AppConfig;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.DesktopUtilities;
 import charactermanaj.util.DirectoryConfig;
 import charactermanaj.util.ErrorMessageHelper;
@@ -45,7 +46,7 @@ import charactermanaj.util.SystemUtil;
 
 /**
  * Aboutボックスを表示する.
- * 
+ *
  * @author seraphy
  */
 public class AboutBox {
@@ -56,7 +57,7 @@ public class AboutBox {
        private static Logger logger = Logger.getLogger(AboutBox.class.getName());
 
        private JFrame parent;
-       
+
        public AboutBox(JFrame parent) {
                if (parent == null) {
                        throw new IllegalArgumentException();
@@ -70,7 +71,16 @@ public class AboutBox {
        public void showAboutBox() {
 
                final JTabbedPane tabs = new JTabbedPane();
-               tabs.setPreferredSize(new Dimension(500, 400));
+
+               // 解像度スケールで補正する
+               Dimension dim = new Dimension(500, 400);
+               if (this.parent != null) {
+                       ScaleSupport scaleSupport = ScaleSupport.getInstance(this.parent);
+                       if (scaleSupport != null) {
+                               dim = scaleSupport.manualScaled(dim);
+                       }
+               }
+               tabs.setPreferredSize(dim);
 
                final JPanel aboutPanel = createAboutPanel();
                final JSysInfoPanel sysInfoPanel = new JSysInfoPanel() {
@@ -81,7 +91,7 @@ public class AboutBox {
                                setText(getSysInfoText());
                        }
                };
-               
+
                tabs.addTab("About", aboutPanel);
                tabs.addTab("System", sysInfoPanel);
 
@@ -92,10 +102,10 @@ public class AboutBox {
                                }
                        }
                });
-               
+
                JOptionPane.showMessageDialog(parent, tabs, "About", JOptionPane.INFORMATION_MESSAGE);
        }
-       
+
        protected JPanel createAboutPanel() {
                LocalizedTextResource textResource = new LocalizedTextResource() {
                        @Override
@@ -111,10 +121,10 @@ public class AboutBox {
 
                String versionInfo = appConfig.getImplementationVersion();
                String specificationVersionInfo = appConfig.getSpecificationVersion();
-               
+
                message = message.replace("@@IMPLEMENTS-VERSIONINFO@@", versionInfo);
                message = message.replace("@@SPECIFICATION-VERSIONINFO@@", specificationVersionInfo);
-               
+
                JPanel aboutPanel = new JPanel(new BorderLayout());
                JEditorPane editorPane = new JEditorPane();
                editorPane.addHyperlinkListener(new HyperlinkListener() {
@@ -161,29 +171,29 @@ public class AboutBox {
                editorPane.setSelectionStart(0);
                editorPane.setSelectionEnd(0);
                aboutPanel.add(new JScrollPane(editorPane), BorderLayout.CENTER);
-               
+
                return aboutPanel;
        }
-       
+
        /**
         * システム情報を取得してHTML形式の文字列として返す.<br>
         * ランタイム情報、システムプロパティ情報、環境変数情報を取得する.<br>
-        * 
+        *
         * @return システム情報のHTML文字列
         */
        protected String getSysInfoText() {
 
                // ランタイム情報の取得
-               
+
                long freeMem, totalMem, maxMem;
                Runtime rt = Runtime.getRuntime();
 
                totalMem = rt.totalMemory() / 1024;
                freeMem = rt.freeMemory() / 1024;
                maxMem = rt.maxMemory() / 1024;
-               
+
                DecimalFormat decimalFmt = new DecimalFormat("#,###,##0");
-               
+
                StringBuilder buf = new StringBuilder();
                buf.append("<html>");
                buf.append("<h2>Runtime Information</h2>");
@@ -192,9 +202,9 @@ public class AboutBox {
                buf.append("<tr><td>Total Memory:</td><td>" + decimalFmt.format(totalMem) + " KiB</td></tr>");
                buf.append("<tr><td>Free Memory:</td><td>" + decimalFmt.format(freeMem) + " KiB</td></tr>");
                buf.append("</table>");
-               
+
                // キャラクターデータベースの取得
-               
+
                DirectoryConfig dirConfig = DirectoryConfig.getInstance();
                String charactersDir = null;
                try {
@@ -202,13 +212,13 @@ public class AboutBox {
                } catch (RuntimeException ex) {
                        charactersDir = "**INVALID**";
                }
-               
+
                buf.append("<h2>Character Database</h2>");
                buf.append("<table border=\"1\">");
                buf.append("<tr><td>Location</td>");
                buf.append("<td>" + escape(charactersDir) + "</td></tr>");
                buf.append("</table>");
-               
+
                // サポートしているエンコーディングの列挙
                buf.append("<h2>Available Charsets</h2>");
                Charset defaultCharset = Charset.defaultCharset();
@@ -257,9 +267,9 @@ public class AboutBox {
                        buf.append("<p><span style=\"color: red;\">This system is not supporting Japanese.</span></p>");
                }
                buf.append(bufChars.toString());
-               
+
                // システムプロパティの取得
-               
+
                buf.append("<h2>System Properties</h2><table border=\"1\">");
                try {
                        Properties sysprops = System.getProperties();
@@ -279,9 +289,9 @@ public class AboutBox {
                } catch (Exception ex) {
                        buf.append(escape(ex.toString()));
                }
-               
+
                // 環境変数の取得
-               
+
                buf.append("<h2>System Environments</h2>");
                try {
                        TreeMap<String, String> envMap = new TreeMap<String, String>(); // 環境変数名のアルファベット順にソート
@@ -302,7 +312,7 @@ public class AboutBox {
                buf.append("</html>");
                return buf.toString();
        }
-       
+
        protected String escape(String value) {
                if (value == null) {
                        return null;
@@ -319,16 +329,16 @@ class JSysInfoPanel extends JPanel {
        private static final long serialVersionUID = 1L;
 
        private JEditorPane editorPane;
-       
+
        public JSysInfoPanel() {
                super(new BorderLayout());
-               
+
                editorPane = new JEditorPane();
                editorPane.setEditable(false);
                editorPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
                editorPane.setContentType("text/html");
                editorPane.setText("");
-               
+
                JButton btnSave = new JButton(new AbstractAction("save") {
                        private static final long serialVersionUID = 1L;
                        public void actionPerformed(ActionEvent e) {
@@ -347,21 +357,21 @@ class JSysInfoPanel extends JPanel {
                btnPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
                btnPanel.add(btnSave, BorderLayout.EAST);
                btnPanel.add(btnGc, BorderLayout.WEST);
-               
+
                add(new JScrollPane(editorPane), BorderLayout.CENTER);
                add(btnPanel, BorderLayout.SOUTH);
        }
-       
+
        public void setText(String message) {
                editorPane.setText(message);
                editorPane.setSelectionStart(0);
                editorPane.setSelectionEnd(0);
        }
-       
+
        protected void onGc() {
                SystemUtil.gc();
        }
-       
+
        protected void onSave() {
                JFileChooser chooser = new JFileChooser();
                chooser.setSelectedFile(new File("sysinfo.html"));
@@ -384,10 +394,10 @@ class JSysInfoPanel extends JPanel {
                        } finally {
                                os.close();
                        }
-                       
+
                } catch (Exception ex) {
                        ErrorMessageHelper.showErrorDialog(this, ex);
                }
        }
-       
+
 }
index c8e3eb7..41e1ea3 100644 (file)
@@ -62,6 +62,7 @@ import javax.swing.table.TableColumnModel;
 
 import charactermanaj.Main;
 import charactermanaj.model.AppConfig;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.BeanPropertiesUtilities;
 import charactermanaj.util.BeanPropertiesUtilities.PropertyAccessor;
 import charactermanaj.util.BeanPropertiesUtilities.PropertyAccessorMap;
@@ -317,14 +318,14 @@ public class AppConfigDialog extends JDialog {
                        fireTableRowsUpdated(rowIndex, rowIndex);
                }
 
-               public void adjustColumnModel(TableColumnModel columnModel) {
+               public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                        Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
                                        .getLocalizedProperties("languages/appconfigdialog");
                        int mx = columnModel.getColumnCount();
                        for (int idx = 0; idx < mx; idx++) {
                                String reskey = COLUMNS[idx].getResourceKey() + ".width";
                                int width = Integer.parseInt(strings.getProperty(reskey));
-                               columnModel.getColumn(idx).setPreferredWidth(width);
+                               columnModel.getColumn(idx).setPreferredWidth((int)(width * scale));
                        }
                }
        }
@@ -454,7 +455,13 @@ public class AppConfigDialog extends JDialog {
 
                add(btnPanel, BorderLayout.SOUTH);
 
-               setSize(600, 400);
+               Dimension dim = new Dimension(600, 400);
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               if (scaleSupport != null) {
+                       // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する
+                       dim = scaleSupport.manualScaled(dim);
+               }
+               setSize(dim);
                setLocationRelativeTo(getParent());
 
                // Notes
@@ -574,11 +581,14 @@ public class AppConfigDialog extends JDialog {
                appConfigTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                appConfigTable.setCellSelectionEnabled(true);
 
+               // 行の高さをフォントの高さにする
+               appConfigTable.setRowHeight((int)(appConfigTable.getFont().getSize() * 1.2));
+
                // データタイプがColorの場合のセルレンダラーとエディタを設定する
                appConfigTable.setDefaultRenderer(Color.class, new ColorCellRender());
                appConfigTable.setDefaultEditor(Color.class, new ColorCellEditor());
 
-               appConfigTableModel.adjustColumnModel(appConfigTable.getColumnModel());
+               appConfigTableModel.adjustColumnModel(appConfigTable.getColumnModel(), scaleSupport.getManualScaleX());
 
                appConfigTableModel.addTableModelListener(new TableModelListener() {
                        @Override
index 0148e8f..b337f18 100644 (file)
@@ -88,6 +88,7 @@ import charactermanaj.ui.progress.ProgressHandle;
 import charactermanaj.ui.progress.Worker;
 import charactermanaj.ui.progress.WorkerException;
 import charactermanaj.ui.progress.WorkerWithProgessDialog;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.ErrorMessageHelper;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
 
@@ -296,7 +297,13 @@ public class ExportWizardDialog extends JDialog {
 
                // 表示
 
-               setSize(500, 500);
+               Dimension dim = new Dimension(500, 500);
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               if (scaleSupport != null) {
+                       // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する
+                       dim = scaleSupport.manualScaled(dim);
+               }
+               setSize(dim);
                setLocationRelativeTo(parent);
 
                mainPanelLayout.first(mainPanel);
@@ -849,10 +856,12 @@ class ExportPartsSelectPanel extends AbstractImportPanel implements ExportPartsR
                partsTable.setGridColor(appConfig.getGridColor());
                partsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                partsTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
-               partsTableModel.adjustColumnModel(partsTable.getColumnModel());
                partsTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
                partsTable.setRowSelectionAllowed(true);
 
+               // 行の高さをフォントの高さにする
+               partsTable.setRowHeight((int)(partsTable.getFont().getSize() * 1.2));
+
                Action actPartsSetCheck = new AbstractAction(strings.getProperty("parts.popup.check")) {
                        private static final long serialVersionUID = 1L;
                        public void actionPerformed(ActionEvent e) {
@@ -943,6 +952,13 @@ class ExportPartsSelectPanel extends AbstractImportPanel implements ExportPartsR
                add(btnPanel, BorderLayout.SOUTH);
        }
 
+       @Override
+       public void addNotify() {
+               super.addNotify();
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               partsTableModel.adjustColumnModel(partsTable.getColumnModel(), scaleSupport.getManualScaleX());
+       }
+
        protected void loadPartsInfo(PartsSpecResolver partsSpecResolver) {
                partsTableModel.clear();
                for (PartsCategory partsCategory : partsSpecResolver.getPartsCategories()) {
@@ -1104,6 +1120,9 @@ class ExportPresetSelectPanel extends AbstractImportPanel implements ExportPrese
                presetTable.setGridColor(appConfig.getGridColor());
                presetTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
 
+               // 行の高さをフォントの高さにする
+               presetTable.setRowHeight((int)(presetTable.getFont().getSize() * 1.2));
+
                final Action actSelectUsedParts = new AbstractAction(
                                strings.getProperty("preset.popup.selectUsedParts")) {
                        private static final long serialVersionUID = 1L;
@@ -1119,7 +1138,6 @@ class ExportPresetSelectPanel extends AbstractImportPanel implements ExportPrese
 
 
                presetTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-               presetTableModel.adjustColumnModel(presetTable.getColumnModel());
 
                add(new JScrollPane(presetTable), BorderLayout.CENTER);
 
@@ -1179,6 +1197,13 @@ class ExportPresetSelectPanel extends AbstractImportPanel implements ExportPrese
                add(btnPanel, BorderLayout.SOUTH);
        }
 
+       @Override
+       public void addNotify() {
+               super.addNotify();
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               presetTableModel.adjustColumnModel(presetTable.getColumnModel(), scaleSupport.getManualScaleX());
+       }
+
        protected void loadPresetInfo(Collection<PartsSet> partsSets, String defaultPresetId) {
                presetTableModel.clear();
                for (PartsSet orgPartsSet : partsSets) {
@@ -1298,9 +1323,9 @@ class ExportPartsTableModel extends AbstractTableModelWithComboBoxModel<ExportPa
                };
        }
 
-       public void adjustColumnModel(TableColumnModel columnModel) {
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                for (int idx = 0; idx < columnWidths.length; idx++) {
-                       columnModel.getColumn(idx).setPreferredWidth(columnWidths[idx]);
+                       columnModel.getColumn(idx).setPreferredWidth((int)(columnWidths[idx] * scale));
                }
        }
 
@@ -1648,9 +1673,9 @@ class ExportPresetTableModel extends AbstractTableModelWithComboBoxModel<ExportP
 
        private String defaultPresetId;
 
-       public void adjustColumnModel(TableColumnModel columnModel) {
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                for (int idx = 0; idx < columnWidths.length; idx++) {
-                       columnModel.getColumn(idx).setPreferredWidth(columnWidths[idx]);
+                       columnModel.getColumn(idx).setPreferredWidth((int)(columnWidths[idx] * scale));
                }
        }
 
index 63f71db..514ce96 100644 (file)
@@ -58,6 +58,7 @@ import charactermanaj.model.PartsCategory;
 import charactermanaj.model.PartsIdentifier;
 import charactermanaj.model.PartsSpec;
 import charactermanaj.model.PartsSpecResolver;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
 import charactermanaj.util.UIHelper;
 
@@ -221,7 +222,8 @@ public class ImageSelectPanel extends JPanel {
         * @param partsCategory パーツカテゴリ
         * @param partsSpecResolver キャラクターデータ
         */
-       public ImageSelectPanel(final PartsCategory partsCategory, final PartsSpecResolver partsSpecResolver) {
+       public ImageSelectPanel(ScaleSupport scaleSupport, final PartsCategory partsCategory,
+                       final PartsSpecResolver partsSpecResolver) {
                if (partsCategory == null || partsSpecResolver == null) {
                        throw new IllegalArgumentException();
                }
@@ -240,11 +242,13 @@ public class ImageSelectPanel extends JPanel {
 
                partsSelectTableModel = new PartsSelectListModel(partsCategory);
 
+               double scale = scaleSupport.getManualScaleX();
+
                final DefaultTableColumnModel columnModel = new DefaultTableColumnModel();
-               TableColumn checkColumn = new TableColumn(0, 32);
-               checkColumn.setMaxWidth(42);
+               TableColumn checkColumn = new TableColumn(0, (int)(32 * scale));
+               checkColumn.setMaxWidth((int)(42 * scale));
                columnModel.addColumn(checkColumn);
-               columnModel.addColumn(new TableColumn(1, 100));
+               columnModel.addColumn(new TableColumn(1, (int)(100 * scale)));
 
                final DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
                selectionModel.addListSelectionListener(new ListSelectionListener() {
@@ -310,6 +314,7 @@ public class ImageSelectPanel extends JPanel {
                                return null;
                        }
                };
+
                partsSelectTable.addFocusListener(new FocusAdapter() {
                        @Override
                        public void focusGained(FocusEvent e) {
@@ -320,6 +325,10 @@ public class ImageSelectPanel extends JPanel {
                                partsSelectTable.repaint();
                        }
                });
+
+               // 行の高さをフォントの高さにする
+               partsSelectTable.setRowHeight((int)(partsSelectTable.getFont().getSize() * 1.2));
+
                final JPopupMenu partsSelectTablePopupMenu = new JPopupMenu();
                Action actDeselectAll = new AbstractAction(
                                strings.getProperty("popupmenu.deselectall")) {
@@ -527,6 +536,7 @@ public class ImageSelectPanel extends JPanel {
 
                // デフォルトのパネル幅を設定する.
                Dimension dim = new Dimension(200, 200);
+               dim = scaleSupport.manualScaled(dim);
                setPreferredSize(dim);
 
                // パネルの初期サイズ
index d76f22e..a67a6be 100644 (file)
@@ -101,6 +101,7 @@ import charactermanaj.ui.progress.Worker;
 import charactermanaj.ui.progress.WorkerException;
 import charactermanaj.ui.progress.WorkerWithProgessDialog;
 import charactermanaj.ui.util.FileDropTarget;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.ErrorMessageHelper;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
 
@@ -376,7 +377,13 @@ public class ImportWizardDialog extends JDialog {
 
                // 表示
 
-               setSize(500, 550);
+               Dimension dim = new Dimension(500, 500);
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               if (scaleSupport != null) {
+                       // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する
+                       dim = scaleSupport.manualScaled(dim);
+               }
+               setSize(dim);
                setLocationRelativeTo(parent);
 
                mainPanelLayout.first(mainPanel);
@@ -1173,9 +1180,9 @@ class URLTableModel extends AbstractTableModelWithComboBoxModel<URLTableRow> {
        }
 
 
-       public void adjustColumnModel(TableColumnModel columnModel) {
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                for (int idx = 0; idx < COLUMN_WIDTHS.length; idx++) {
-                       columnModel.getColumn(idx).setPreferredWidth(COLUMN_WIDTHS[idx]);
+                       columnModel.getColumn(idx).setPreferredWidth((int)(COLUMN_WIDTHS[idx] * scale));
                }
        }
 
@@ -1844,10 +1851,12 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel {
                partsTable.setShowGrid(true);
                partsTable.setGridColor(appConfig.getGridColor());
                partsTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
-               partsTableModel.adjustColumnModel(partsTable.getColumnModel());
                partsTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
                partsTable.setRowSelectionAllowed(true);
 
+               // 行の高さをフォントの高さにする
+               partsTable.setRowHeight((int)(partsTable.getFont().getSize() * 1.2));
+
                Action actPartsSetCheck = new AbstractAction(strings.getProperty("parts.popup.check")) {
                        private static final long serialVersionUID = 1L;
                        public void actionPerformed(ActionEvent e) {
@@ -1949,6 +1958,12 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel {
                add(btnPanel, BorderLayout.SOUTH);
        }
 
+       @Override
+       public void addNotify() {
+               super.addNotify();
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               partsTableModel.adjustColumnModel(partsTable.getColumnModel(), scaleSupport.getDefaultScaleX());
+       }
 
        @Override
        public void onActive(ImportWizardDialog parent, ImportWizardCardPanel previousPanel) {
@@ -2721,10 +2736,10 @@ class ImportPartsTableModel extends AbstractTableModelWithComboBoxModel<ImportPa
                return false;
        }
 
-       public void adjustColumnModel(TableColumnModel columnModel) {
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                int mx = columnModel.getColumnCount();
                for (int idx = 0; idx < mx; idx++) {
-                       columnModel.getColumn(idx).setWidth(COLUMN_WIDTHS[idx]);
+                       columnModel.getColumn(idx).setWidth((int)(COLUMN_WIDTHS[idx] * scale));
                }
        }
 
@@ -2918,6 +2933,9 @@ class ImportPresetSelectPanel extends ImportWizardCardPanel {
                presetTable.setGridColor(appConfig.getGridColor());
                presetTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
 
+               // 行の高さをフォントの高さにする
+               presetTable.setRowHeight((int)(presetTable.getFont().getSize() * 1.2));
+
                actSelectUsedParts = new AbstractAction(strings.getProperty("preset.popup.selectUsedParts")) {
                        private static final long serialVersionUID = 1L;
 
@@ -2930,9 +2948,7 @@ class ImportPresetSelectPanel extends ImportWizardCardPanel {
                popupMenu.add(actSelectUsedParts);
 
                presetTable.setComponentPopupMenu(popupMenu);
-
                presetTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-               presetTableModel.adjustColumnModel(presetTable.getColumnModel());
 
                add(new JScrollPane(presetTable), BorderLayout.CENTER);
 
@@ -2996,6 +3012,13 @@ class ImportPresetSelectPanel extends ImportWizardCardPanel {
        }
 
        @Override
+       public void addNotify() {
+               super.addNotify();
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               presetTableModel.adjustColumnModel(presetTable.getColumnModel(), scaleSupport.getManualScaleX());
+       }
+
+       @Override
        public void onActive(ImportWizardDialog parent,
                        ImportWizardCardPanel previousPanel) {
                this.parent= parent;
@@ -3302,10 +3325,10 @@ class ImportPresetTableModel extends AbstractTableModelWithComboBoxModel<ImportP
                return rowModel.getPartsSet().getPartsSetId().equals(defaultPartsSetId);
        }
 
-       public void adjustColumnModel(TableColumnModel columnModel) {
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                int mx = columnModel.getColumnCount();
                for (int idx = 0; idx < mx; idx++) {
-                       columnModel.getColumn(idx).setWidth(COLUMN_WIDTHS[idx]);
+                       columnModel.getColumn(idx).setWidth((int)(COLUMN_WIDTHS[idx] * scale));
                }
        }
 
index 2f2c640..1703b03 100644 (file)
@@ -5,6 +5,7 @@ import static java.lang.Math.*;
 import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.Container;
+import java.awt.Dimension;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
@@ -65,6 +66,7 @@ import charactermanaj.model.PartsSpecResolver;
 import charactermanaj.model.io.PartsImageCollectionParser;
 import charactermanaj.model.io.PartsImageCollectionParser.PartsImageCollectionHandler;
 import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.DesktopUtilities;
 import charactermanaj.util.ErrorMessageHelper;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
@@ -137,13 +139,17 @@ public class InformationDialog extends JDialog {
                                return prepareRenderer;
                        }
                };
-               informationTableModel.adjustColumnModel(informationTable.getColumnModel());
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               informationTableModel.adjustColumnModel(informationTable.getColumnModel(), scaleSupport.getManualScaleX());
                informationTable.setShowGrid(true);
                informationTable.setGridColor(appConfig.getGridColor());
                informationTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
                informationTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                informationTable.setRowHeight(informationTable.getRowHeight() + 4);
 
+               // 行の高さをフォントの高さにする
+               informationTable.setRowHeight((int)(informationTable.getFont().getSize() * 1.2));
+
                informationTable.setDefaultRenderer(JButton.class, new ButtonCellRender());
                informationTable.setDefaultEditor(JButton.class, new ButtonCellEditor());
 
@@ -232,7 +238,10 @@ public class InformationDialog extends JDialog {
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeInformationDialog");
                am.put("closeInformationDialog", actClose);
 
-               pack();
+               // 推奨サイズをスクリーンのスケールで調整する
+               Dimension dim = getPreferredSize();
+               dim = scaleSupport.manualScaled(dim);
+               setSize(dim);
                setLocationRelativeTo(parent);
        }
 
@@ -421,9 +430,9 @@ class InformationTableModel extends AbstractTableModelWithComboBoxModel<Informat
                }
        }
 
-       public void adjustColumnModel(TableColumnModel columnModel) {
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                for (int idx = 0; idx < COLUMNS.length; idx++) {
-                       columnModel.getColumn(idx).setPreferredWidth(columnWidths[idx]);
+                       columnModel.getColumn(idx).setPreferredWidth((int)(columnWidths[idx] * scale));
                }
        }
 
index ea6a85f..d0a372e 100644 (file)
@@ -72,6 +72,7 @@ import charactermanaj.model.ListChangeListener;
 import charactermanaj.model.ObservableList;
 import charactermanaj.model.PartsCategory;
 import charactermanaj.ui.model.SimpleComboBoxModel;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
 
 /**
@@ -390,7 +391,15 @@ public class LayerOrderCustomizeDialog extends JDialog {
                tblLayerOrder.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                tblLayerOrder.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
-               dataModel.adjustColumnModel(tblLayerOrder.getColumnModel());
+               // 行の高さをフォントの高さにする
+               tblLayerOrder.setRowHeight((int)(tblLayerOrder.getFont().getSize() * 1.2));
+
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               int tableWidth = dataModel.adjustColumnModel(tblLayerOrder.getColumnModel(), scaleSupport.getManualScaleX());
+
+               Dimension tablePrefSize = scr.getPreferredSize();
+               tablePrefSize.width = tableWidth + 10;
+               scr.setPreferredSize(tablePrefSize);
 
                AbstractAction actAddLayer = new AbstractAction(strings.getProperty("btnAdd")) {
                        private static final long serialVersionUID = 1L;
@@ -679,11 +688,14 @@ public class LayerOrderCustomizeDialog extends JDialog {
                 * カラム幅を設定する。
                 * @param columnModel
                 */
-               public void adjustColumnModel(TableColumnModel columnModel) {
+               public int adjustColumnModel(TableColumnModel columnModel, double scale) {
+                       int total = 0;
                        for (int idx = 0; idx < columns.length; idx++) {
-                               columnModel.getColumn(idx).setPreferredWidth(
-                                               columns[idx].getPrefWidth());
+                               int width = (int)(columns[idx].getPrefWidth() * scale);
+                               columnModel.getColumn(idx).setPreferredWidth(width);
+                               total += width;
                        }
+                       return total;
                }
 
                /**
@@ -1321,8 +1333,9 @@ public class LayerOrderCustomizeDialog extends JDialog {
                        am.put("closeAddLayerDialog", actCancel);
 
                        // コンボボックスの推奨幅を明示的に指定する。(言語によっては幅が小さくなりすぎるため)
+                       ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
                        Dimension prefSize = cmbCategory.getPreferredSize();
-                       prefSize.width = 200;
+                       prefSize.width = (int)(200 * scaleSupport.getManualScaleX());
                        cmbCategory.setPreferredSize(prefSize);
                        pack();
 
index adf3b26..7cb5cd2 100644 (file)
@@ -119,6 +119,7 @@ import charactermanaj.ui.model.WallpaperFactoryException;
 import charactermanaj.ui.model.WallpaperInfo;
 import charactermanaj.ui.scrollablemenu.JScrollableMenu;
 import charactermanaj.ui.util.FileDropTarget;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.ui.util.WindowAdjustLocationSupport;
 import charactermanaj.util.DesktopUtilities;
 import charactermanaj.util.ErrorMessageHelper;
@@ -473,7 +474,14 @@ public class MainFrame extends JFrame
                int imageHeight = min(maxHeight, max(400, imageSize != null ? imageSize.height : 0));
                // 300x400の画像の場合にメインフレームが600x550だとちょうどいい感じ.
                // それ以上大きい画像の場合は増えた分だけフレームを大きくしておく.
-               setSize(imageWidth - 300 + 600, imageHeight - 400 + 550);
+
+               Dimension dim = new Dimension(imageWidth - 300 + 600, imageHeight - 400 + 550);
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               if (scaleSupport != null) {
+                       // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する
+                       dim = scaleSupport.manualScaled(dim);
+               }
+               setSize(dim);
 
                // 現在表示されていなければ、次回表示時にプラットフォーム固有位置に表示するように予約
                if (!isShowing()) {
@@ -733,11 +741,13 @@ public class MainFrame extends JFrame
 
                imageSelectPanels = new ImageSelectPanelList();
 
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+
                JPanel imgSelectPanelsPanel = new JPanel();
                BoxLayout bl = new BoxLayout(imgSelectPanelsPanel, BoxLayout.PAGE_AXIS);
                imgSelectPanelsPanel.setLayout(bl);
                for (PartsCategory category : characterData.getPartsCategories()) {
-                       final ImageSelectPanel imageSelectPanel = new ImageSelectPanel(category, characterData);
+                       final ImageSelectPanel imageSelectPanel = new ImageSelectPanel(scaleSupport, category, characterData);
                        imgSelectPanelsPanel.add(imageSelectPanel);
                        imageSelectPanels.add(imageSelectPanel);
                        partsSelectionManager.register(imageSelectPanel);
index b8fc132..8e5ccd7 100644 (file)
@@ -48,6 +48,7 @@ import javax.swing.table.AbstractTableModel;
 
 import charactermanaj.model.CharacterData;
 import charactermanaj.model.PartsSet;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
 import charactermanaj.util.UIHelper;
 
@@ -228,8 +229,10 @@ public class ManageFavoriteDialog extends JDialog {
                partsSetListModel = new PartsSetListTableModel();
                partsSetList = new JTable(partsSetListModel);
                partsSetList.setRowSelectionAllowed(true);
-               partsSetList
-                               .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+               partsSetList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+
+               // 行の高さをフォントの高さにする
+               partsSetList.setRowHeight((int)(partsSetList.getFont().getSize() * 1.2));
 
                partsSetList.setTableHeader(null);
                partsSetList.getColumnModel().getColumn(1).setMaxWidth(150);
@@ -316,7 +319,13 @@ public class ManageFavoriteDialog extends JDialog {
                am.put("deleteFav", actDelete);
                am.put("closeManageFavoriteDialog", actCancel);
 
-               setSize(400, 500);
+               Dimension dim = new Dimension(400, 500);
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               if (scaleSupport != null) {
+                       // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する
+                       dim = scaleSupport.manualScaled(dim);
+               }
+               setSize(dim);
                setLocationRelativeTo(parent);
 
                final JPopupMenu popupMenu = new JPopupMenu();
index c29c646..266c71c 100644 (file)
@@ -4,6 +4,7 @@ import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
 import java.awt.Container;
+import java.awt.Dimension;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
@@ -68,6 +69,7 @@ import charactermanaj.model.PartsSpec;
 import charactermanaj.model.io.PartsInfoXMLReader;
 import charactermanaj.model.io.PartsInfoXMLWriter;
 import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.DesktopUtilities;
 import charactermanaj.util.ErrorMessageHelper;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
@@ -75,33 +77,33 @@ import charactermanaj.util.LocalizedResourcePropertyLoader;
 public class PartsManageDialog extends JDialog {
 
        private static final long serialVersionUID = 1L;
-       
+
        protected static final String STRINGS_RESOURCE = "languages/partsmanagedialog";
-       
-       
+
+
        private static final Logger logger = Logger.getLogger(PartsManageDialog.class.getName());
 
        private CharacterData characterData;
-       
+
        private PartsManageTableModel partsManageTableModel;
-       
+
        private JTable partsManageTable;
-       
+
        private JTextField txtHomepage;
-       
+
        private JTextField txtAuthor;
-       
+
        private boolean updated;
 
-       
+
        public PartsManageDialog(JFrame parent, CharacterData characterData) {
                super(parent, true);
-               
+
                if (characterData == null) {
                        throw new IllegalArgumentException();
                }
                this.characterData = characterData;
-               
+
                setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
                addWindowListener(new WindowAdapter() {
                        @Override
@@ -116,7 +118,7 @@ public class PartsManageDialog extends JDialog {
                setTitle(strings.getProperty("title"));
 
                Container contentPane = getContentPane();
-               
+
                // パーツリストテーブル
                JPanel partsListPanel = new JPanel();
                partsListPanel.setBorder(BorderFactory.createCompoundBorder(
@@ -125,7 +127,7 @@ public class PartsManageDialog extends JDialog {
 
                GridBagLayout partsListPanelLayout = new GridBagLayout();
                partsListPanel.setLayout(partsListPanelLayout);
-               
+
                partsManageTableModel = new PartsManageTableModel();
                partsManageTable = new JTable(partsManageTableModel) {
                        private static final long serialVersionUID = 1L;
@@ -166,12 +168,16 @@ public class PartsManageDialog extends JDialog {
                };
                partsManageTable.setShowGrid(true);
                partsManageTable.setGridColor(AppConfig.getInstance().getGridColor());
-               partsManageTableModel.adjustColumnModel(partsManageTable.getColumnModel());
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               partsManageTableModel.adjustColumnModel(partsManageTable.getColumnModel(), scaleSupport.getManualScaleX());
                partsManageTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                partsManageTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
 
+               // 行の高さをフォントの高さにする
+               partsManageTable.setRowHeight((int)(partsManageTable.getFont().getSize() * 1.2));
+
                JScrollPane partsManageTableSP = new JScrollPane(partsManageTable);
-               
+
                partsManageTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
                        public void valueChanged(ListSelectionEvent e) {
                                if (!e.getValueIsAdjusting()) {
@@ -179,13 +185,13 @@ public class PartsManageDialog extends JDialog {
                                }
                        }
                });
-               
+
                partsManageTableModel.addTableModelListener(new TableModelListener() {
                        public void tableChanged(TableModelEvent e) {
                                onTableDataChange(e.getFirstRow(), e.getLastRow());
                        }
                });
-               
+
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridx = 0;
                gbc.gridy = 0;
@@ -199,7 +205,7 @@ public class PartsManageDialog extends JDialog {
                gbc.weightx = 1.;
                gbc.weighty = 1.;
                partsListPanel.add(partsManageTableSP, gbc);
-               
+
                Action actSortByName = new AbstractAction(strings.getProperty("sortByName")) {
                        private static final long serialVersionUID = 1L;
                        public void actionPerformed(ActionEvent e) {
@@ -218,7 +224,7 @@ public class PartsManageDialog extends JDialog {
                                onSortByTimestamp();
                        }
                };
-               
+
                gbc.gridx = 0;
                gbc.gridy = 1;
                gbc.gridheight = 1;
@@ -271,9 +277,9 @@ public class PartsManageDialog extends JDialog {
                popupMenu.add(new JSeparator());
                popupMenu.add(actApplyAllVersion);
                popupMenu.add(actApplyAllDownloadURL);
-               
+
                partsManageTable.setComponentPopupMenu(popupMenu);
-               
+
                // 作者情報パネル
                JPanel authorPanel = new JPanel();
                authorPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
@@ -281,7 +287,7 @@ public class PartsManageDialog extends JDialog {
                                .createTitledBorder(strings.getProperty("author.info"))));
                GridBagLayout authorPanelLayout = new GridBagLayout();
                authorPanel.setLayout(authorPanelLayout);
-               
+
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.gridheight = 1;
@@ -330,7 +336,7 @@ public class PartsManageDialog extends JDialog {
                if (!DesktopUtilities.isSupported()) {
                        actBrowseHomepage.setEnabled(false);
                }
-               
+
                txtAuthor.getDocument().addDocumentListener(new DocumentListener() {
                        public void removeUpdate(DocumentEvent e) {
                                onEditAuthor();
@@ -353,14 +359,14 @@ public class PartsManageDialog extends JDialog {
                                onEditHomepage();
                        }
                });
-               
-               
+
+
                // ボタンパネル
                JPanel btnPanel = new JPanel();
                btnPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 45));
                GridBagLayout btnPanelLayout = new GridBagLayout();
                btnPanel.setLayout(btnPanelLayout);
-               
+
                Action actClose = new AbstractAction(strings.getProperty("cancel")) {
                        private static final long serialVersionUID = 1L;
                        public void actionPerformed(ActionEvent e) {
@@ -373,12 +379,12 @@ public class PartsManageDialog extends JDialog {
                                onOK();
                        }
                };
-               
+
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.weightx = 1.;
                btnPanel.add(Box.createHorizontalGlue(), gbc);
-               
+
                gbc.gridx = Main.isLinuxOrMacOSX() ? 2 : 1;
                gbc.gridy = 0;
                gbc.weightx = 0.;
@@ -388,16 +394,16 @@ public class PartsManageDialog extends JDialog {
                gbc.gridy = 0;
                gbc.weightx = 0.;
                btnPanel.add(new JButton(actClose), gbc);
-               
+
                // ダイアログ下部
                JPanel southPanel = new JPanel(new BorderLayout());
                southPanel.add(authorPanel, BorderLayout.NORTH);
                southPanel.add(btnPanel, BorderLayout.SOUTH);
 
                contentPane.add(southPanel, BorderLayout.SOUTH);
-               
+
                // キーボード
-               
+
                Toolkit tk = Toolkit.getDefaultToolkit();
                JRootPane rootPane = getRootPane();
                InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
@@ -408,14 +414,16 @@ public class PartsManageDialog extends JDialog {
 
                // モデル構築
                partsManageTableModel.initModel(characterData);
-               
+
                // ウィンドウ配置
-               setSize(500, 400);
+               Dimension dim = new Dimension(500, 400);
+               dim = scaleSupport.manualScaled(dim);
+               setSize(dim);
                setLocationRelativeTo(parent);
        }
 
        private Semaphore authorEditSemaphore = new Semaphore(1);
-       
+
        protected void onChangeSelection() {
                try {
                        authorEditSemaphore.acquire();
@@ -471,11 +479,11 @@ public class PartsManageDialog extends JDialog {
                        ErrorMessageHelper.showErrorDialog(this, ex);
                }
        }
-       
+
        protected void onTableDataChange(int firstRow, int lastRow) {
                onChangeSelection();
        }
-       
+
        protected void onApplyAllLastModified() {
                int[] selRows = partsManageTable.getSelectedRows();
                if (selRows.length == 0) {
@@ -520,7 +528,7 @@ public class PartsManageDialog extends JDialog {
                                return;
                        }
                }
-               
+
                PartsManageTableRow firstRow = partsManageTableModel.getRow(selRows[0]);
                String downloadURL = firstRow.getDownloadURL();
                if (downloadURL == null) {
@@ -531,7 +539,7 @@ public class PartsManageDialog extends JDialog {
                        // キャンセルされたか、内容に変化ない場合は何もしない
                        return;
                }
-               
+
                for (int selRow : selRows) {
                        PartsManageTableRow row = partsManageTableModel.getRow(selRow);
                        row.setDownloadURL(downloadURL_new);
@@ -541,7 +549,7 @@ public class PartsManageDialog extends JDialog {
                }
                partsManageTableModel.fireTableRowsUpdated(selRows[0], selRows[selRows.length - 1]);
        }
-       
+
        protected void onApplyAllVersion() {
                Toolkit tk = Toolkit.getDefaultToolkit();
                int[] selRows = partsManageTable.getSelectedRows();
@@ -586,7 +594,7 @@ public class PartsManageDialog extends JDialog {
                        tk.beep();
                        return;
                }
-               
+
                for (int selRow : selRows) {
                        PartsManageTableRow row = partsManageTableModel.getRow(selRow);
                        row.setVersion(version_new);
@@ -596,7 +604,7 @@ public class PartsManageDialog extends JDialog {
                }
                partsManageTableModel.fireTableRowsUpdated(selRows[0], selRows[selRows.length - 1]);
        }
-       
+
        protected void onEditHomepage() {
                try {
                        if (!authorEditSemaphore.tryAcquire()) {
@@ -637,24 +645,24 @@ public class PartsManageDialog extends JDialog {
                                                lastRow = Math.min(lastRow, selRow);
                                        }
                                }
-                               
+
                                String homepage = partsManageTableModel.getHomepage(author);
                                if (homepage == null) {
                                        homepage = "";
                                }
                                txtHomepage.setText(homepage);
-                               
+
                                if (firstRow >= 0) {
                                        partsManageTable.repaint();
                                }
                        } finally {
-                               authorEditSemaphore.release();                          
+                               authorEditSemaphore.release();
                        }
                } catch (Exception ex) {
                        ErrorMessageHelper.showErrorDialog(this, ex);
                }
        }
-       
+
        protected void onClose() {
                Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
                                .getLocalizedProperties(STRINGS_RESOURCE);
@@ -667,7 +675,7 @@ public class PartsManageDialog extends JDialog {
                updated = false;
                dispose();
        }
-       
+
        protected void onBrosweHomepage() {
                Toolkit tk = Toolkit.getDefaultToolkit();
                String homepage = txtHomepage.getText();
@@ -684,26 +692,26 @@ public class PartsManageDialog extends JDialog {
                        logger.log(Level.INFO, "browse failed. : " + homepage, ex);
                }
        }
-       
+
        protected void onSortByAuthor() {
                partsManageTableModel.sortByAuthor();
        }
-       
+
        protected void onSortByName() {
                partsManageTableModel.sortByName();
        }
-       
+
        protected void onSortByTimestamp() {
                partsManageTableModel.sortByTimestamp();
        }
-       
+
        protected void onOK() {
                if (partsManageTable.isEditing()) {
                        Toolkit tk = Toolkit.getDefaultToolkit();
                        tk.beep();
                        return;
                }
-               
+
                int mx = partsManageTableModel.getRowCount();
 
                // 作者ごとのホームページ情報の取得
@@ -725,34 +733,34 @@ public class PartsManageDialog extends JDialog {
                }
 
                PartsManageData partsManageData = new PartsManageData();
-               
+
                // パーツごとの作者とバージョン、ダウンロード先の取得
                for (int idx = 0; idx < mx; idx++) {
                        PartsManageTableRow row = partsManageTableModel.getRow(idx);
-                       
+
                        String author = row.getAuthor();
                        PartsAuthorInfo partsAuthorInfo = null;
                        if (author != null && author.trim().length() > 0) {
                                partsAuthorInfo = authorInfoMap.get(author.trim());
                        }
-                       
+
                        double version = row.getVersion();
                        String downloadURL = row.getDownloadURL();
                        String localizedName = row.getLocalizedName();
                        Timestamp lastModified = row.getLastModified();
-                       
+
                        PartsManageData.PartsVersionInfo versionInfo = new PartsManageData.PartsVersionInfo();
                        versionInfo.setVersion(version);
                        versionInfo.setDownloadURL(downloadURL);
                        versionInfo.setLastModified(lastModified);
 
                        PartsIdentifier partsIdentifier = row.getPartsIdentifier();
-                       
+
                        PartsManageData.PartsKey partsKey = new PartsManageData.PartsKey(partsIdentifier);
                        partsManageData.putPartsInfo(partsKey, localizedName,
                                        partsAuthorInfo, versionInfo);
                }
-               
+
                // パーツ管理情報を書き込む.
                PartsInfoXMLWriter xmlWriter = new PartsInfoXMLWriter();
                try {
@@ -763,14 +771,14 @@ public class PartsManageDialog extends JDialog {
                        ErrorMessageHelper.showErrorDialog(this, ex);
                        return;
                }
-               
+
                updated = true;
                dispose();
        }
 
        /**
         * パーツ管理情報が更新されたか?
-        * 
+        *
         * @return 更新された場合はtrue、そうでなければfalse
         */
        public boolean isUpdated() {
@@ -779,21 +787,21 @@ public class PartsManageDialog extends JDialog {
 }
 
 class PartsManageTableRow {
-       
+
        private PartsIdentifier partsIdentifier;
-       
+
        private Timestamp timestamp;
-       
+
        private String localizedName;
-       
+
        private String author;
-       
+
        private String homepage;
-       
+
        private String downloadURL;
-       
+
        private double version;
-       
+
        private Timestamp lastModified;
 
        public PartsManageTableRow(PartsIdentifier partsIdentifier,
@@ -805,9 +813,9 @@ class PartsManageTableRow {
                this.localizedName = partsIdentifier.getLocalizedPartsName();
 
                this.timestamp = new Timestamp(partsSpec.getPartsFiles().lastModified());
-               
+
                this.lastModified = lastModified;
-               
+
                PartsAuthorInfo autherInfo = partsSpec.getAuthorInfo();
                if (autherInfo != null) {
                        author = autherInfo.getAuthor();
@@ -822,11 +830,11 @@ class PartsManageTableRow {
                downloadURL = partsSpec.getDownloadURL();
                version = partsSpec.getVersion();
        }
-       
+
        public PartsIdentifier getPartsIdentifier() {
                return partsIdentifier;
        }
-       
+
        public Timestamp getTimestamp() {
                return timestamp;
        }
@@ -834,46 +842,46 @@ class PartsManageTableRow {
        public String getLocalizedName() {
                return localizedName;
        }
-       
+
        public void setLocalizedName(String localizedName) {
                if (localizedName == null || localizedName.trim().length() == 0) {
                        throw new IllegalArgumentException();
                }
                this.localizedName = localizedName;
        }
-       
+
        public String getAuthor() {
                return author;
        }
-       
+
        public String getDownloadURL() {
                return downloadURL;
        }
-       
+
        public double getVersion() {
                return version;
        }
-       
+
        public void setAuthor(String author) {
                this.author = author;
        }
-       
+
        public void setDownloadURL(String downloadURL) {
                this.downloadURL = downloadURL;
        }
-       
+
        public void setVersion(double version) {
                this.version = version;
        }
-       
+
        public String getHomepage() {
                return homepage;
        }
-       
+
        public void setHomepage(String homepage) {
                this.homepage = homepage;
        }
-       
+
        public Timestamp getLastModified() {
                return lastModified;
        }
@@ -1040,21 +1048,21 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
                }
        }
 
-       
+
        public int getColumnCount() {
                return Columns.values().length;
        }
-       
+
        @Override
        public String getColumnName(int column) {
                return Columns.values()[column].getDisplayName();
        }
-       
-       public void adjustColumnModel(TableColumnModel columnModel) {
+
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                Columns[] columns = Columns.values();
                for (int idx = 0; idx < columns.length; idx++) {
                        columnModel.getColumn(idx).setPreferredWidth(
-                                       columns[idx].getWidth());
+                                       (int)(columns[idx].getWidth() * scale));
                }
        }
 
@@ -1063,7 +1071,7 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
                Columns column = Columns.values()[columnIndex];
                return column.getValue(row);
        }
-       
+
        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
                PartsManageTableRow row = getRow(rowIndex);
@@ -1080,19 +1088,19 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
                // 変更通知
                fireTableRowsUpdated(rowIndex, columnIndex);
        }
-       
+
        @Override
        public Class<?> getColumnClass(int columnIndex) {
                Columns column = Columns.values()[columnIndex];
                return column.getColumnClass();
        }
-       
+
        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
                Columns column = Columns.values()[columnIndex];
                return column.isEditable();
        }
-       
+
        public void initModel(CharacterData characterData) {
                if (characterData == null) {
                        throw new IllegalArgumentException();
@@ -1120,7 +1128,7 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
                                        .getPartsSpecMap(partsCategory).entrySet()) {
                                PartsIdentifier partsIdentifier = entry.getKey();
                                PartsSpec partsSpec = entry.getValue();
-                               
+
                                // パーツ管理情報ファイルから、パーツ管理情報を設定した時点の
                                // ファイルサイズや更新日時などを読み取る.
                                PartsKey partsKey = new PartsKey(partsIdentifier);
@@ -1147,7 +1155,7 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
         * ホームページはAuthorに対して1つであるが、Authorが自由編集可能であるため便宜的にRowに持たせている.<br>
         * 結果として同じAuthorに対して同じ値を設定する必要がある.<br>
         * ホームページはテーブルに表示されないのでリスナーへの通知は行わない.<br>
-        * 
+        *
         * @param author
         *            作者、空またはnullは何もしない.
         * @param homepage
@@ -1171,7 +1179,7 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
        /**
         * ホームページを取得する.<br>
         * 該当する作者がないか、作者がnullまたは空の場合は常にnullを返す.<br>
-        * 
+        *
         * @param author
         *            作者
         * @return ホームページ、またはnull
@@ -1191,7 +1199,7 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
                }
                return null;
        }
-       
+
        protected static final Comparator<PartsManageTableRow> NAMED_SORTER
                = new Comparator<PartsManageTableRow>() {
                public int compare(PartsManageTableRow o1, PartsManageTableRow o2) {
@@ -1217,12 +1225,12 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
                        return ret;
                }
        };
-       
+
        public void sortByName() {
                Collections.sort(elements, NAMED_SORTER);
                fireTableDataChanged();
        }
-       
+
        public void sortByTimestamp() {
                Collections.sort(elements, new Comparator<PartsManageTableRow>() {
                        public int compare(PartsManageTableRow o1, PartsManageTableRow o2) {
index 153fec1..9e8f762 100644 (file)
@@ -76,6 +76,7 @@ import charactermanaj.model.io.CharacterDataDefaultProvider;
 import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;
 import charactermanaj.model.io.CharacterDataPersistent;
 import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.DesktopUtilities;
 import charactermanaj.util.ErrorMessageHelper;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
@@ -565,6 +566,10 @@ public class ProfileEditDialog extends JDialog {
                colorGroupTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
                colorGroupTable.setRowHeight(colorGroupTable.getRowHeight() + 4);
                colorGroupTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+               // 行の高さをフォントの高さにする
+               colorGroupTable.setRowHeight((int)(colorGroupTable.getFont().getSize() * 1.2));
+
                colorGroupPanel.add(new JScrollPane(colorGroupTable), BorderLayout.CENTER);
 
                JPanel colorGroupBtnPanel = new JPanel();
@@ -677,9 +682,14 @@ public class ProfileEditDialog extends JDialog {
                categoriesTable.setRowHeight(categoriesTable.getRowHeight() + 4);
                categoriesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                categoriesTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+               // 行の高さをフォントの高さにする
+               categoriesTable.setRowHeight((int)(categoriesTable.getFont().getSize() * 1.2));
+
                categoriesPanel.add(new JScrollPane(categoriesTable), BorderLayout.CENTER);
 
-               categoriesTableModel.adjustColumnModel(categoriesTable.getColumnModel());
+               ScaleSupport scaleSupprt = ScaleSupport.getInstance(this);
+               categoriesTableModel.adjustColumnModel(categoriesTable.getColumnModel(), scaleSupprt.getManualScaleX());
 
                JPanel categoriesBtnPanel = new JPanel();
                GridBagLayout categoryBtnPanelLayout = new GridBagLayout();
@@ -784,7 +794,8 @@ public class ProfileEditDialog extends JDialog {
                                return comp;
                        }
                };
-               layersTableModel.adjustColumnModel(layersTable.getColumnModel());
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               layersTableModel.adjustColumnModel(layersTable.getColumnModel(), scaleSupport.getManualScaleX());
 
                JComboBox colorGroupCombo = new JComboBox(
                                new FirstItemInjectionComboBoxModelWrapper<ColorGroupsTableRow>(colorGroupsTableModel, ColorGroupsTableRow.NA));
@@ -801,6 +812,10 @@ public class ProfileEditDialog extends JDialog {
 
                layersTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                layersTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+               // 行の高さをフォントの高さにする
+               layersTable.setRowHeight((int)(layersTable.getFont().getSize() * 1.2));
+
                layersPanel.add(new JScrollPane(layersTable), BorderLayout.CENTER);
 
                JPanel layersBtnPanel = new JPanel();
@@ -917,7 +932,7 @@ public class ProfileEditDialog extends JDialog {
                                return comp;
                        }
                };
-               partssetsTableModel.adjustColumnModel(partssetsTable.getColumnModel());
+               partssetsTableModel.adjustColumnModel(partssetsTable.getColumnModel(), scaleSupport.getManualScaleX());
 
                partssetsTable.setRowHeight(layersTable.getRowHeight() + 4);
 
@@ -926,6 +941,10 @@ public class ProfileEditDialog extends JDialog {
                partssetsTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
                partssetsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                partssetsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+               // 行の高さをフォントの高さにする
+               partssetsTable.setRowHeight((int)(partssetsTable.getFont().getSize() * 1.2));
+
                partssetsPanel.add(new JScrollPane(partssetsTable), BorderLayout.CENTER);
 
                // Recommendations
@@ -950,7 +969,7 @@ public class ProfileEditDialog extends JDialog {
                                return comp;
                        }
                };
-               recommendationsTableModel.adjustColumnModel(recommendationsTable.getColumnModel());
+               recommendationsTableModel.adjustColumnModel(recommendationsTable.getColumnModel(), scaleSupport.getManualScaleX());
 
                recommendationsTable.setRowHeight(layersTable.getRowHeight() + 4);
 
@@ -960,6 +979,9 @@ public class ProfileEditDialog extends JDialog {
                recommendationsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                recommendationsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
+               // 行の高さをフォントの高さにする
+               recommendationsTable.setRowHeight((int)(recommendationsTable.getFont().getSize() * 1.2));
+
                recommendationsPanel.add(new JScrollPane(recommendationsTable), BorderLayout.CENTER);
 
                JPanel recommendationsBtnPanel = new JPanel();
@@ -1114,7 +1136,9 @@ public class ProfileEditDialog extends JDialog {
 
                contentPane.add(tabbedPane, BorderLayout.CENTER);
 
-               setSize(500, 500);
+               Dimension dim = new Dimension(500, 500);
+               dim = scaleSupport.manualScaled(dim);
+               setSize(dim);
                setLocationRelativeTo(parent);
 
                updateUIState();
@@ -2157,12 +2181,12 @@ class CategoriesTableModel extends AbstractTableModelWithComboBoxModel<Categorie
        public CategoriesTableModel() {
        }
 
-       public void adjustColumnModel(TableColumnModel columnModel) {
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                for (int idx = 0; idx < COLUMNS.length; idx++) {
                        ColumnDef columnDef = COLUMNS[idx];
                        String reskey = columnDef.getResourceKey();
                        int width = Integer.parseInt(strings.getProperty(reskey + ".width"));
-                       columnModel.getColumn(idx).setPreferredWidth(width);
+                       columnModel.getColumn(idx).setPreferredWidth((int)(width * scale));
                }
        }
 
@@ -2431,9 +2455,9 @@ class LayersTableModel extends AbstractTableModelWithComboBoxModel<LayersTableRo
                super();
        }
 
-       public void adjustColumnModel(TableColumnModel columnModel) {
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                for (int idx = 0; idx < layersColumnWidths.length; idx++) {
-                       columnModel.getColumn(idx).setPreferredWidth(layersColumnWidths[idx]);
+                       columnModel.getColumn(idx).setPreferredWidth((int)(layersColumnWidths[idx] * scale));
                }
        }
 
@@ -2749,9 +2773,9 @@ class PartssetsTableModel extends AbstractTableModelWithComboBoxModel<PresetsTab
                return defaultPartsSetId;
        }
 
-       public void adjustColumnModel(TableColumnModel columnModel) {
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                for (int idx = 0; idx < partssetsColumnWidths.length; idx++) {
-                       columnModel.getColumn(idx).setPreferredWidth(partssetsColumnWidths[idx]);
+                       columnModel.getColumn(idx).setPreferredWidth((int)(partssetsColumnWidths[idx] * scale));
                }
        }
 
@@ -2956,9 +2980,9 @@ class RecommendationTableModel extends AbstractTableModelWithComboBoxModel<Recom
        public RecommendationTableModel() {
        }
 
-       public void adjustColumnModel(TableColumnModel columnModel) {
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                for (int idx = 0; idx < partssetsColumnWidths.length; idx++) {
-                       columnModel.getColumn(idx).setPreferredWidth(partssetsColumnWidths[idx]);
+                       columnModel.getColumn(idx).setPreferredWidth((int)(partssetsColumnWidths[idx] * scale));
                }
        }
 
index 9a35f7a..0172d40 100644 (file)
@@ -92,6 +92,7 @@ import charactermanaj.model.io.CustomLayerOrderPersist;
 import charactermanaj.model.io.PartsImageDirectoryWatchAgent;
 import charactermanaj.model.io.PartsImageDirectoryWatchAgentFactory;
 import charactermanaj.ui.util.FileDropTarget;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.ui.util.SingleRootFileSystemView;
 import charactermanaj.util.DesktopUtilities;
 import charactermanaj.util.ErrorMessageHelper;
@@ -233,7 +234,11 @@ public class ProfileSelectorDialog extends JDialog {
                characterList.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                characterList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
-               characterListModel.adjustColumnModel(characterList.getColumnModel());
+               // 行の高さをフォントの高さにする
+               characterList.setRowHeight((int)(characterList.getFont().getSize() * 1.2));
+
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               characterListModel.adjustColumnModel(characterList.getColumnModel(), scaleSupport.getManualScaleX());
 
                characterList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                characterList.getSelectionModel().addListSelectionListener(
@@ -556,7 +561,11 @@ public class ProfileSelectorDialog extends JDialog {
 
                int width = Integer.parseInt(strings.getProperty("windowWidth"));
                int height = Integer.parseInt(strings.getProperty("windowHeight"));
-               setSize(width, height);
+
+               Dimension dim = new Dimension(width, height);
+               // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する
+               dim = scaleSupport.manualScaled(dim);
+               setSize(dim);
                setLocationRelativeTo(parent);
 
                characterList.requestFocus();
@@ -1469,11 +1478,11 @@ class ProfileSelectorTableModel extends AbstractTableModel {
                return rows.size();
        }
 
-       public void adjustColumnModel(TableColumnModel columnModel) {
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                Columns[] columns = Columns.values();
                for (int idx = 0; idx < columns.length; idx++) {
                        columnModel.getColumn(idx).setPreferredWidth(
-                                       columns[idx].getWidth());
+                                       (int)(columns[idx].getWidth() * scale));
                }
        }
 
index ec523ce..3a025ba 100644 (file)
@@ -2,6 +2,7 @@ package charactermanaj.ui;
 
 import java.awt.BorderLayout;
 import java.awt.Container;
+import java.awt.Dimension;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
@@ -51,52 +52,53 @@ import charactermanaj.model.PartsSpec;
 import charactermanaj.model.PartsSpecResolver;
 import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;
 import charactermanaj.ui.model.PartsSelectionManager;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
 
 public class SearchPartsDialog extends JDialog {
 
        private static final long serialVersionUID = 1L;
-       
-       
+
+
        private static final WeakHashMap<SearchPartsDialog, Object> ALL_DIALOGS
                = new WeakHashMap<SearchPartsDialog, Object>();
-       
-       
+
+
        protected static final String STRINGS_RESOURCE = "languages/searchpartsdialog";
 
        private PartsSpecResolver partsSpecResolver;
-       
+
        private PartsSelectionManager partsSelectionManager;
-       
+
        private JTable searchPartsTable;
-       
-       
+
+
        private SearchPartsTableModel searchPartsTableModel;
-       
+
        private JTextField txtPartsName;
-       
+
        private JComboBox cmbAuthors;
-       
+
        private JComboBox cmbCategories;
-       
-       
+
+
        public static SearchPartsDialog[] getDialogs() {
                return ALL_DIALOGS.keySet().toArray(new SearchPartsDialog[ALL_DIALOGS.size()]);
        }
-       
-       
+
+
        public SearchPartsDialog(JFrame parent,
                        PartsSpecResolver partsSpecResolver,
                        PartsSelectionManager partsSelectionManager) {
                super(parent, false);
-               
+
                if (partsSpecResolver == null) {
                        throw new IllegalArgumentException();
                }
 
                this.partsSpecResolver = partsSpecResolver;
                this.partsSelectionManager = partsSelectionManager;
-               
+
                setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
                addWindowListener(new WindowAdapter() {
                        @Override
@@ -104,28 +106,28 @@ public class SearchPartsDialog extends JDialog {
                                onClose();
                        }
                });
-               
-               
+
+
                Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
                                .getLocalizedProperties(STRINGS_RESOURCE);
 
                setTitle(strings.getProperty("title"));
-               
+
                // モデル
                searchPartsTableModel = new SearchPartsTableModel();
-               
-               
+
+
                // 検索条件パネル
-               
+
                JPanel searchCondPanel = new JPanel();
                GridBagLayout searchCondPanelLayout = new GridBagLayout();
                searchCondPanel.setLayout(searchCondPanelLayout);
                GridBagConstraints gbc = new GridBagConstraints();
-               
+
                searchCondPanel.setBorder(BorderFactory.createCompoundBorder(
                                BorderFactory.createEmptyBorder(5, 5, 5, 5), BorderFactory
                                                .createTitledBorder(strings.getProperty("search.condition"))));
-               
+
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.gridheight = 1;
@@ -138,19 +140,19 @@ public class SearchPartsDialog extends JDialog {
                gbc.weightx = 0.;
                gbc.weighty = 0.;
                searchCondPanel.add(new JLabel(strings.getProperty("partsname"), JLabel.RIGHT), gbc);
-               
+
                gbc.gridx = 1;
                gbc.gridy = 0;
                gbc.weightx = 1.;
                txtPartsName = new JTextField();
                searchCondPanel.add(txtPartsName, gbc);
-               
+
                gbc.gridx = 0;
                gbc.gridy = 1;
                gbc.gridwidth = 1;
                gbc.weightx = 0.;
                searchCondPanel.add(new JLabel(strings.getProperty("author"), JLabel.RIGHT), gbc);
-               
+
                gbc.gridx = 1;
                gbc.gridy = 1;
                gbc.gridwidth = 2;
@@ -160,13 +162,13 @@ public class SearchPartsDialog extends JDialog {
                authors.addAll(getAuthors(partsSpecResolver));
                cmbAuthors = new JComboBox(authors.toArray(new String[authors.size()]));
                searchCondPanel.add(cmbAuthors, gbc);
-               
+
                gbc.gridx = 0;
                gbc.gridy = 2;
                gbc.gridwidth = 1;
                gbc.weightx = 0.;
                searchCondPanel.add(new JLabel(strings.getProperty("partscategory"), JLabel.RIGHT), gbc);
-               
+
                gbc.gridx = 1;
                gbc.gridy = 2;
                gbc.gridwidth = 2;
@@ -192,7 +194,7 @@ public class SearchPartsDialog extends JDialog {
                        }
                });
                searchCondPanel.add(btnClear, gbc);
-               
+
                // 検索結果
                JPanel searchResult = new JPanel(new BorderLayout());
                searchResult.setBorder(BorderFactory.createCompoundBorder(
@@ -201,8 +203,13 @@ public class SearchPartsDialog extends JDialog {
                searchPartsTable = new JTable(searchPartsTableModel);
                searchPartsTable.setShowGrid(true);
                searchPartsTable.setGridColor(AppConfig.getInstance().getGridColor());
+
+               // 行の高さをフォントの高さにする
+               searchPartsTable.setRowHeight((int)(searchPartsTable.getFont().getSize() * 1.2));
+
                JScrollPane searchPartsTableSP = new JScrollPane(searchPartsTable);
-               searchPartsTableModel.adjustColumnModel(searchPartsTable.getColumnModel());
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               searchPartsTableModel.adjustColumnModel(searchPartsTable.getColumnModel(), scaleSupport.getManualScaleX());
                searchResult.add(searchPartsTableSP, BorderLayout.CENTER);
                searchPartsTable.addMouseListener(new MouseAdapter() {
                        @Override
@@ -214,7 +221,7 @@ public class SearchPartsDialog extends JDialog {
                                }
                        }
                });
-               
+
                // テーブルのキーイベント
                ActionMap tblAm = searchPartsTable.getActionMap();
                InputMap tblIm = searchPartsTable.getInputMap();
@@ -225,7 +232,7 @@ public class SearchPartsDialog extends JDialog {
                                onSelect();
                        }
                });
-               
+
                JPanel btnPanel = new JPanel();
                btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 10));
                GridBagLayout btnPanelLayout = new GridBagLayout();
@@ -255,10 +262,10 @@ public class SearchPartsDialog extends JDialog {
                });
                btnPanel.add(btnSelect, gbc);
                searchResult.add(btnPanel, BorderLayout.SOUTH);
-               
-               
+
+
                // 検索条件の入力が変更されたことを検知するリスナの登録
-               
+
                txtPartsName.getDocument().addDocumentListener(new DocumentListener() {
                        public void removeUpdate(DocumentEvent e) {
                                onChangeCondition();
@@ -270,7 +277,7 @@ public class SearchPartsDialog extends JDialog {
                                onChangeCondition();
                        }
                });
-               
+
                ActionListener changeListener = new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                onChangeCondition();
@@ -278,7 +285,7 @@ public class SearchPartsDialog extends JDialog {
                };
                cmbAuthors.addActionListener(changeListener);
                cmbCategories.addActionListener(changeListener);
-               
+
                // ESCキーとCTRL-Wで閉じる.
                Toolkit tk = Toolkit.getDefaultToolkit();
                JRootPane rootPane = getRootPane();
@@ -292,7 +299,7 @@ public class SearchPartsDialog extends JDialog {
                                onClose();
                        }
                });
-               
+
                // ウィンドウがアクティブになったときに検索フィールドにフォーカスをあてる
                addWindowFocusListener(new WindowAdapter() {
                    public void windowGainedFocus(WindowEvent e) {
@@ -305,14 +312,17 @@ public class SearchPartsDialog extends JDialog {
                contentPane.setLayout(new BorderLayout());
                contentPane.add(searchCondPanel, BorderLayout.NORTH);
                contentPane.add(searchResult, BorderLayout.CENTER);
-               
-               setSize(250, 300);
+
+               Dimension dim = new Dimension(250, 300);
+               // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する
+               dim = scaleSupport.manualScaled(dim);
+               setSize(dim);
                setLocationRelativeTo(parent);
-               
+
                // ダイアログの登録
                ALL_DIALOGS.put(this, null);
        }
-       
+
        public List<String> getAuthors(PartsSpecResolver partsSpecResolver) {
                if (partsSpecResolver == null) {
                        throw new IllegalArgumentException();
@@ -327,16 +337,16 @@ public class SearchPartsDialog extends JDialog {
                                }
                        }
                }
-               
-               ArrayList<String> authors = new ArrayList<String>(authorsSet); 
+
+               ArrayList<String> authors = new ArrayList<String>(authorsSet);
                Collections.sort(authors);
                return authors;
        }
-       
+
        protected void onClose() {
                dispose();
        }
-       
+
        /**
         * 「選択」ボタンまたはテーブルのダブルクリックのハンドラ.<br>
         * 選択されている行のパーツ識別子をもとに、パーツにフォーカスをあてる.<br>
@@ -349,20 +359,20 @@ public class SearchPartsDialog extends JDialog {
                        partsSelectionManager.setSelection(partsIdentifier);
                }
        }
-       
+
        protected void onChangeCondition() {
                String partsNamesRaw = txtPartsName.getText();
                partsNamesRaw = partsNamesRaw.replace(" ", " "); // 全角空白を半角に変換
                String[] condPartsNames = partsNamesRaw.split("\\s+");
-               
+
                PartsCategory condPartsCategory = (PartsCategory) cmbCategories.getSelectedItem();
                String condAuthor = (String) cmbAuthors.getSelectedItem();
                if (condAuthor != null && condAuthor.trim().length() == 0) {
                        condAuthor = null;
                }
-               
+
                ArrayList<Map.Entry<PartsIdentifier, PartsSpec>> partsIdentifiers = new ArrayList<Map.Entry<PartsIdentifier, PartsSpec>>();
-               
+
                for (PartsCategory partsCategory : partsSpecResolver.getPartsCategories()) {
                        if (condPartsCategory != null && !condPartsCategory.equals(partsCategory)) {
                                continue;
@@ -397,7 +407,7 @@ public class SearchPartsDialog extends JDialog {
                });
                searchPartsTableModel.initModel(partsIdentifiers);
        }
-       
+
 }
 
 class SearchPartsTableModel extends AbstractTableModelWithComboBoxModel<Map.Entry<PartsIdentifier, PartsSpec>> {
@@ -405,13 +415,13 @@ class SearchPartsTableModel extends AbstractTableModelWithComboBoxModel<Map.Entr
        private static final long serialVersionUID = 1L;
 
        private static final String[] COLUMN_NAMES;
-       
+
        private static final int[] COLUMN_WIDTHS;
-       
+
        static {
                Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
                                .getLocalizedProperties(SearchPartsDialog.STRINGS_RESOURCE);
-               
+
                COLUMN_NAMES = new String[] {
                                strings.getProperty("column.partsname"),
                                strings.getProperty("column.category"),
@@ -423,28 +433,28 @@ class SearchPartsTableModel extends AbstractTableModelWithComboBoxModel<Map.Entr
                                Integer.parseInt(strings.getProperty("column.author.width")),
                };
        }
-       
-       public void adjustColumnModel(TableColumnModel columnModel) {
+
+       public void adjustColumnModel(TableColumnModel columnModel, double scale) {
                for (int idx = 0; idx < COLUMN_WIDTHS.length; idx++) {
-                       columnModel.getColumn(idx).setPreferredWidth(COLUMN_WIDTHS[idx]);
+                       columnModel.getColumn(idx).setPreferredWidth((int)(COLUMN_WIDTHS[idx] * scale));
                }
        }
-       
+
        public int getColumnCount() {
                return COLUMN_NAMES.length;
        }
-       
+
        @Override
        public String getColumnName(int column) {
                return COLUMN_NAMES[column];
        }
-       
+
        public Object getValueAt(int rowIndex, int columnIndex) {
                Map.Entry<PartsIdentifier, PartsSpec> row = getRow(rowIndex);
-               
+
                PartsIdentifier partsIdentifier = row.getKey();
                PartsSpec partsSpec = row.getValue();
-               
+
                switch (columnIndex) {
                case 0:
                        return partsIdentifier.getLocalizedPartsName();
@@ -455,7 +465,7 @@ class SearchPartsTableModel extends AbstractTableModelWithComboBoxModel<Map.Entr
                }
                return "";
        }
-       
+
        public void initModel(List<Map.Entry<PartsIdentifier, PartsSpec>> partsIdentifiers) {
                clear();
                if (partsIdentifiers != null) {
@@ -464,6 +474,6 @@ class SearchPartsTableModel extends AbstractTableModelWithComboBoxModel<Map.Entr
                        }
                }
        }
-       
+
 }
 
index 97e94bb..6fd5275 100644 (file)
@@ -1,6 +1,5 @@
 package charactermanaj.ui;
 
-import java.awt.BorderLayout;
 import java.awt.Container;
 import java.awt.Dimension;
 import java.awt.Font;
@@ -26,6 +25,7 @@ import java.util.logging.Logger;
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
 import javax.swing.Box;
+import javax.swing.BoxLayout;
 import javax.swing.InputMap;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
@@ -42,6 +42,7 @@ import javax.swing.KeyStroke;
 import charactermanaj.Main;
 import charactermanaj.model.io.WorkingSetPersist;
 import charactermanaj.ui.util.FileDropTarget;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.ErrorMessageHelper;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
 import charactermanaj.util.UIHelper;
@@ -144,9 +145,6 @@ public class SelectCharatersDirDialog extends JDialog {
                Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
                        .getLocalizedProperties("languages/selectCharatersDirDialog");
 
-               Container contentPane = getContentPane();
-               contentPane.setLayout(new BorderLayout(3, 3));
-
                AbstractAction actOk = new AbstractAction(strings.getProperty("btn.ok")) {
                        private static final long serialVersionUID = 1L;
                        public void actionPerformed(ActionEvent e) {
@@ -213,108 +211,82 @@ public class SelectCharatersDirDialog extends JDialog {
                btnCancel.addFocusListener(focusAdapter);
                btnBroseForDir.addFocusListener(focusAdapter);
 
+               Container contentPane = getContentPane();
+               contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
+
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+
+               {
+                       JLabel lbl = new JLabel(strings.getProperty("caption"));
+                       lbl.setFont(lbl.getFont().deriveFont(Font.BOLD));
+                       lbl.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0));
+                       Dimension dim = lbl.getPreferredSize();
+                       dim.width = Integer.parseInt(strings.getProperty("width"));
+                       dim = scaleSupport.manualScaled(dim);
+                       lbl.setPreferredSize(dim);
+                       Box header = Box.createHorizontalBox();
+                       header.add(lbl);
+                       contentPane.add(header);
+               }
+               {
+                       JPanel dirPanel = new JPanel(new GridBagLayout());
+                       dirPanel.setBorder(BorderFactory.createEmptyBorder(3, 10, 3, 3));
+
+                       combDir = new JComboBox();
+                       combDir.setEditable(true);
+
+                       GridBagConstraints gbc = new GridBagConstraints();
+                       gbc.gridx = 0;
+                       gbc.gridy = 0;
+                       gbc.insets = new Insets(3, 3, 3, 3);
+                       dirPanel.add(new JLabel(strings.getProperty("lbl.dir")), gbc);
+
+                       gbc.gridx = 1;
+                       gbc.fill = GridBagConstraints.BOTH;
+                       gbc.weightx = 1;
+                       dirPanel.add(combDir, gbc);
+
+                       gbc.gridx = 2;
+                       gbc.weightx = 0;
+                       dirPanel.add(btnBroseForDir, gbc);
+
+                       // リサイズ時に開く余白部
+                       gbc.gridx = 0;
+                       gbc.gridy = 1;
+                       gbc.weighty = 1;
+                       dirPanel.add(Box.createGlue(), gbc);
+                       contentPane.add(dirPanel);
+               }
 
-               JPanel dirPanel = new JPanel(new BorderLayout(3, 3));
-               dirPanel.setBorder(BorderFactory.createEmptyBorder(3, 10, 3, 3));
-
-               JLabel lbl = new JLabel(strings.getProperty("caption"), JLabel.CENTER);
-               lbl.setFont(lbl.getFont().deriveFont(Font.BOLD));
-               lbl.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0));
-               Dimension dim = lbl.getPreferredSize();
-               dim.width = Integer.parseInt(strings.getProperty("width"));
-               lbl.setPreferredSize(dim);
-               dirPanel.add(lbl, BorderLayout.NORTH);
-
-               combDir = new JComboBox();
-               combDir.setEditable(true);
-
-               dirPanel.add(combDir, BorderLayout.CENTER);
-
-               dirPanel.add(new JLabel(strings.getProperty("lbl.dir")), BorderLayout.WEST);
-               dirPanel.add(btnBroseForDir, BorderLayout.EAST);
-
-               contentPane.add(dirPanel, BorderLayout.NORTH);
-
-               JPanel btnPanel = new JPanel();
-               GridBagLayout gbl = new GridBagLayout();
-               btnPanel.setLayout(gbl);
-
-               chkDoNotAsk = new JCheckBox(strings.getProperty("chk.doNotAskAgein"));
-               chkDoNotAsk.setSelected(recentCharactersDir.isDoNotAskAgain());
-
-               GridBagConstraints gbc = new GridBagConstraints();
-               gbc.gridx = 0;
-               gbc.gridy = 0;
-               gbc.gridwidth = 5;
-               gbc.gridheight = 1;
-               gbc.weightx = 1.;
-               gbc.weighty = 0.;
-               gbc.fill = GridBagConstraints.BOTH;
-               gbc.anchor = GridBagConstraints.WEST;
-               gbc.ipadx = 0;
-               gbc.ipady = 0;
-               gbc.insets = new Insets(3, 3, 3, 3);
-
-               btnPanel.add(chkDoNotAsk, gbc);
-
-               gbc.gridx = 0;
-               gbc.gridy = 1;
-               gbc.gridwidth = 1;
-               gbc.gridheight = 1;
-               gbc.weightx = 0.;
-               gbc.weighty = 0.;
-               btnPanel.add(btnRemoveRecent, gbc);
-
-               gbc.gridx = 1;
-               gbc.gridy = 1;
-               gbc.gridwidth = 1;
-               gbc.gridheight = 1;
-               gbc.weightx = 0.;
-               gbc.weighty = 0.;
-               btnPanel.add(btnRemoveWorkingSets, gbc);
-
-               gbc.gridx = 2;
-               gbc.gridy = 1;
-               gbc.gridwidth = 1;
-               gbc.gridheight = 1;
-               gbc.weightx = 1.;
-               gbc.weighty = 0.;
-
-               btnPanel.add(Box.createGlue(), gbc);
-
-               gbc.gridx = Main.isLinuxOrMacOSX() ? 4 : 3;
-               gbc.gridy = 1;
-               gbc.gridwidth = 1;
-               gbc.gridheight = 1;
-               gbc.weightx = 0.;
-               gbc.weighty = 0.;
-
-               btnPanel.add(btnOK, gbc);
-
-
-               gbc.gridx = Main.isLinuxOrMacOSX() ? 3 : 4;
-               gbc.gridy = 1;
-               gbc.gridwidth = 1;
-               gbc.gridheight = 1;
-               gbc.weightx = 0.;
-               gbc.weighty = 0.;
-               btnPanel.add(btnCancel, gbc);
-
-               gbc.gridx = 5;
-               gbc.gridy = 1;
-               gbc.gridwidth = 1;
-               gbc.gridheight = 1;
-               gbc.weightx = 0.;
-               gbc.weighty = 0.;
-               gbc.ipadx = 32;
-               gbc.ipady = 0;
-
-               btnPanel.add(Box.createGlue(), gbc);
+               {
+                       chkDoNotAsk = new JCheckBox(strings.getProperty("chk.doNotAskAgein"));
+                       chkDoNotAsk.setSelected(recentCharactersDir.isDoNotAskAgain());
 
-               setTitle(strings.getProperty("title"));
-               setResizable(false);
+                       Box chkPanel = Box.createHorizontalBox();
+                       chkPanel.add(chkDoNotAsk);
+                       chkPanel.add(Box.createHorizontalGlue());
+                       contentPane.add(chkPanel);
+               }
 
-               contentPane.add(btnPanel, BorderLayout.SOUTH);
+               {
+                       Box btnsBox = Box.createHorizontalBox();
+                       btnsBox.add(btnRemoveRecent);
+                       btnsBox.add(btnRemoveWorkingSets);
+                       btnsBox.add(Box.createHorizontalGlue());
+
+                       if (!Main.isLinuxOrMacOSX()) {
+                               btnsBox.add(btnOK);
+                               btnsBox.add(btnCancel);
+                       } else {
+                               btnsBox.add(btnCancel);
+                               btnsBox.add(btnOK);
+                       }
+                       btnsBox.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 24));
+                       contentPane.add(btnsBox);
+               }
+
+               setTitle(strings.getProperty("title"));
+               setResizable(true);
 
                // フォルダのドロップによる入力を許可
                new DropTarget(this, new FileDropTarget() {
index 605350a..5d6da80 100644 (file)
@@ -3,6 +3,7 @@ package charactermanaj.ui;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Container;
+import java.awt.Dimension;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
@@ -38,6 +39,7 @@ import javax.swing.event.ChangeListener;
 
 import charactermanaj.Main;
 import charactermanaj.graphics.io.UkagakaImageConverter;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
 
 /**
@@ -57,23 +59,23 @@ public class UkagakaConvertDialog extends JDialog {
         * キャプション
         */
        private TextField caption = new TextField();
-       
+
        /**
         * キャンセル
         */
        private AbstractAction actCancel;
-       
+
        /**
         * 保存(デフォルトアクション)
         */
        private AbstractAction actSave;
-       
+
 
        /**
         * プレビュー(PNG)
         */
        private SamplePicturePanel opaqueImagePanel = new SamplePicturePanel();
-       
+
        /**
         * プレビュー(PNA)
         */
@@ -83,17 +85,17 @@ public class UkagakaConvertDialog extends JDialog {
         * 透過色キー表示ボックス
         */
        private ColorBox colorBox = new ColorBox();
-       
+
        /**
         * エクスポート対象の元イメージ.
         */
        private BufferedImage originalImage;
-       
+
        /**
         * 透過色をマニュアルとするか?
         */
        private boolean manualTransparentColorKey;
-       
+
        /**
         * 透過キー自動モード
         */
@@ -103,27 +105,27 @@ public class UkagakaConvertDialog extends JDialog {
         * 透過キー手動選択モード
         */
        private JRadioButton radioManual;
-       
+
        /**
         * 上書きモードチェックボックス
         */
        private JCheckBox chkOverwriteOption;
-       
+
        /**
         * 終了コード
         */
        private Object result;
-       
+
        /**
         * 保存ボタンアクションリスナ.<br>
         */
        private ActionListener saveActionListener;
-       
+
        /**
         * 上書きオプションの表示フラグ
         */
        private boolean showOverwriteOption;
-       
+
 
        /**
         * 伺か用PNG/PNA出力設定ダイアログを構築する.
@@ -132,11 +134,11 @@ public class UkagakaConvertDialog extends JDialog {
        public UkagakaConvertDialog(JFrame parent) {
                this(parent, false);
        }
-       
+
        /**
         * 伺か用PNG/PNA出力設定ダイアログを構築する.
         * @param parent 親フレーム
-        * @param overwriteOption 上書きオプションの表示 
+        * @param overwriteOption 上書きオプションの表示
         */
        public UkagakaConvertDialog(JFrame parent, boolean overwriteOption) {
                this(parent, null, overwriteOption);
@@ -146,7 +148,7 @@ public class UkagakaConvertDialog extends JDialog {
         * 伺か用PNG/PNA出力設定ダイアログを構築する.
         * @param parent 親フレーム
         * @param saveActionListener 保存ボタンアクション
-        * @param overwriteOption 上書きオプションの表示 
+        * @param overwriteOption 上書きオプションの表示
         */
        public UkagakaConvertDialog(JFrame parent, ActionListener saveActionListener, boolean overwriteOption) {
                super(parent, true);
@@ -163,7 +165,7 @@ public class UkagakaConvertDialog extends JDialog {
                                result = null;
                        }
                });
-               
+
                try {
                        initComponent();
 
@@ -177,7 +179,7 @@ public class UkagakaConvertDialog extends JDialog {
         * コンポーネントの初期化
         */
        private void initComponent() {
-               
+
                Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
                        .getLocalizedProperties(STRINGS_RESOURCE);
 
@@ -197,7 +199,7 @@ public class UkagakaConvertDialog extends JDialog {
                                onSave();
                        }
                };
-               
+
                JButton btnCancel = new JButton(actCancel);
                JButton btnSave = new JButton(actSave);
 
@@ -207,18 +209,18 @@ public class UkagakaConvertDialog extends JDialog {
                contentPane.add(caption, BorderLayout.NORTH);
                caption.setEditable(false);
                caption.setVisible(false);
-               
+
                JScrollPane opaqueSp = new JScrollPane(opaqueImagePanel);
                JScrollPane alphaSp = new JScrollPane(alphaImagePanel);
 
                JPanel previewSpPane = new JPanel();
                BoxLayout boxlayout = new BoxLayout(previewSpPane, BoxLayout.LINE_AXIS);
                previewSpPane.setLayout(boxlayout);
-               
+
                previewSpPane.add(opaqueSp);
                previewSpPane.add(Box.createHorizontalStrut(3));
                previewSpPane.add(alphaSp);
-               
+
                previewSpPane.setBorder(BorderFactory.createCompoundBorder(
                                BorderFactory.createTitledBorder(strings.getProperty("preview")),
                                BorderFactory.createEmptyBorder(3, 3, 3, 3)
@@ -235,10 +237,10 @@ public class UkagakaConvertDialog extends JDialog {
                                BorderFactory.createEmptyBorder(3, 3, 3, 3)
                                ));
                centerPane.add(transparentColorPanel, BorderLayout.SOUTH);
-               
-               
+
+
                GridBagConstraints gbc = new GridBagConstraints();
-               
+
                radioAuto = new JRadioButton(strings.getProperty("radio.auto"));
                radioAuto.addChangeListener(new ChangeListener() {
                        public void stateChanged(ChangeEvent e) {
@@ -251,13 +253,13 @@ public class UkagakaConvertDialog extends JDialog {
                                onChange(!radioAuto.isSelected());
                        }
                });
-               
+
                ButtonGroup btngroup = new ButtonGroup();
                btngroup.add(radioAuto);
                btngroup.add(radioManual);
-               
+
                radioAuto.setSelected(!manualTransparentColorKey);
-               
+
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.gridheight = 1;
@@ -277,14 +279,14 @@ public class UkagakaConvertDialog extends JDialog {
                gbc.gridy = 0;
                transparentColorPanel.add(colorBox, gbc);
 
-               
+
                contentPane.add(centerPane, BorderLayout.CENTER);
-               
-               
+
+
                JPanel btnPanel = new JPanel();
                GridBagLayout gbl = new GridBagLayout();
                btnPanel.setLayout(gbl);
-               
+
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.gridheight = 1;
@@ -294,44 +296,50 @@ public class UkagakaConvertDialog extends JDialog {
                gbc.insets = new Insets(3, 3, 3, 3);
                gbc.anchor = GridBagConstraints.WEST;
                gbc.fill = GridBagConstraints.BOTH;
-               
+
                chkOverwriteOption = new JCheckBox(strings.getProperty("chk.overwriteOriginalFile"));
-               
+
                if (showOverwriteOption) {
                        btnPanel.add(chkOverwriteOption, gbc);
 
                } else {
                        btnPanel.add(Box.createHorizontalGlue(), gbc);
                }
-               
+
                gbc.gridx = Main.isLinuxOrMacOSX() ? 2 : 1;
                gbc.gridy = 0;
                gbc.weightx = 0.;
                btnPanel.add(btnSave, gbc);
-               
+
                gbc.gridx = Main.isLinuxOrMacOSX() ? 1 : 2;
                gbc.gridy = 0;
                btnPanel.add(btnCancel, gbc);
-               
+
                btnPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 45));
-               
+
                contentPane.add(btnPanel, BorderLayout.SOUTH);
-       
+
                JRootPane rootPane = getRootPane();
                InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
                ActionMap am = rootPane.getActionMap();
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeExportWizDialog");
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeExportWizDialog");
-                
+
                am.put("closeExportWizDialog", actCancel);
-               
+
                rootPane.setDefaultButton(btnSave);
-               
+
                rootPane.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5));
 
-               setSize(450, 450);
+               Dimension dim = new Dimension(450, 450);
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               if (scaleSupport != null) {
+                       // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する
+                       dim = scaleSupport.manualScaled(dim);
+               }
+               setSize(dim);
                setLocationRelativeTo(getParent());
-               
+
                // colorBoxの色変更イベントのハンドル
                colorBox.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
@@ -339,7 +347,7 @@ public class UkagakaConvertDialog extends JDialog {
                        }
                });
        }
-       
+
        /**
         * 出力するイメージを設定する.
         * @param img イメージ(TYPE_INT_ARGBのみ)
@@ -352,7 +360,7 @@ public class UkagakaConvertDialog extends JDialog {
                if (img.getType() != BufferedImage.TYPE_INT_ARGB) {
                        throw new IllegalArgumentException("TYPE_INT_ARGB以外は指定できません。");
                }
-               
+
                if (colorKey == null) {
                        colorKey = Color.GREEN;
                }
@@ -362,15 +370,15 @@ public class UkagakaConvertDialog extends JDialog {
 
                rebuildImage();
        }
-       
+
        public BufferedImage getOpaqueImage() {
                return opaqueImagePanel.getSamplePictrue();
        }
-       
+
        public BufferedImage getAlphaImage() {
                return alphaImagePanel.getSamplePictrue();
        }
-       
+
        public void setAutoTransparentColor(boolean mode) {
                if (mode) {
                        radioAuto.setSelected(true);
@@ -381,55 +389,55 @@ public class UkagakaConvertDialog extends JDialog {
                        radioAuto.setSelected(false);
                }
        }
-       
+
        public Color getTransparentColorKey() {
                return colorBox.getColorKey();
        }
-       
+
        public void setTransparentColorKey(Color colorKey) {
                colorBox.setColorKey(colorKey);
        }
-       
+
        public boolean isAutoTransparentColor() {
                return radioAuto.isSelected();
        }
-       
+
        public boolean isOverwriteOriginalFile() {
                return chkOverwriteOption.isSelected();
        }
-       
+
        public void setOverwriteOriginalFile(boolean overwriteOriginalFile) {
                chkOverwriteOption.setSelected(overwriteOriginalFile);
        }
-       
+
        protected void onClose() {
                result = null;
                dispose();
        }
-       
+
        protected void onSave() {
                if (saveActionListener != null) {
                        ActionEvent e = new ActionEvent(this, 0, "save");
                        saveActionListener.actionPerformed(e);
                }
        }
-       
+
        public void setSaveActionListener(ActionListener saveActionListener) {
                this.saveActionListener = saveActionListener;
        }
-       
+
        public ActionListener getSaveActionListener() {
                return saveActionListener;
        }
-       
+
        public Object getResult() {
                return result;
        }
-       
+
        public void setResult(Object result) {
-               this.result = result; 
+               this.result = result;
        }
-       
+
        public void setCaption(String text) {
                if (text == null || text.length() == 0) {
                        caption.setText("");
@@ -440,11 +448,11 @@ public class UkagakaConvertDialog extends JDialog {
                        caption.setVisible(true);
                }
        }
-       
+
        public String getCaption() {
                return caption.getText();
        }
-       
+
        /**
         * 透過色のマニュアル選択.<br>
         */
@@ -465,7 +473,7 @@ public class UkagakaConvertDialog extends JDialog {
                        rebuildImage();
                }
        }
-       
+
        /**
         * 伺か用のPNG/PNA画像を生成してプレビューに設定します.<br>
         */
@@ -476,16 +484,16 @@ public class UkagakaConvertDialog extends JDialog {
                UkagakaImageConverter conv = UkagakaImageConverter.getInstance();
 
                BufferedImage pna = conv.createUkagakaPNA(originalImage);
-               
+
                Color transparentColorKey = null;
                if (manualTransparentColorKey) {
                        transparentColorKey = colorBox.getColorKey();
                } else {
                        transparentColorKey = conv.detectTransparentColorKey(originalImage);
                }
-               
+
                BufferedImage png = conv.createUkagakaPNG(originalImage, transparentColorKey);
-               
+
                opaqueImagePanel.setSamplePicture(png);
                alphaImagePanel.setSamplePicture(pna);
        }
index 3f91bcf..ef9aa3c 100644 (file)
@@ -46,6 +46,7 @@ import charactermanaj.graphics.io.ImagePreviewFileChooser;
 import charactermanaj.ui.model.PredefinedWallpaper;
 import charactermanaj.ui.model.WallpaperInfo;
 import charactermanaj.ui.model.WallpaperInfo.WallpaperResourceType;
+import charactermanaj.ui.util.ScaleSupport;
 import charactermanaj.util.LocalizedMessageComboBoxRender;
 import charactermanaj.util.LocalizedResourcePropertyLoader;
 
@@ -71,49 +72,49 @@ public class WallpaperDialog extends JDialog {
         * 壁紙情報
         */
        private WallpaperInfo wallpaperInfo = new WallpaperInfo();
-       
-       
+
+
        /**
         * 選択なしラジオ
         */
        private JRadioButton radioNone;
-       
+
        /**
         * ファイルから選択ラジオ
         */
        private JRadioButton radioFile;
-       
+
        /**
         * 定義済みから選択ラジオ
         */
        private JRadioButton radioPredefined;
-       
+
        /**
         * 定義済み壁紙リスト
         */
        private JList listPredefinedWallpapers;
-       
+
        /**
         * 背景画像の透過率
         */
        private JSpinner spinnerAlpha;
-       
+
        /**
         * 選択ファイルフィールド
         */
        private JTextField txtFile;
-       
+
        /**
         * ファイルを選択アクション
         */
        private AbstractAction actChooseFile;
-       
+
        /**
         * 背景色選択コンポーネント
         */
        private ColorBox colorBox;
 
-       
+
        /**
         * コンストラクタ
         * @param parent 親フレーム
@@ -127,16 +128,16 @@ public class WallpaperDialog extends JDialog {
                                        onCancel();
                                };
                        });
-                       
+
                        initPredefinedWallpapers();
                        initComponent();
-                       
+
                } catch (RuntimeException ex) {
                        dispose();
                        throw ex;
                }
        }
-       
+
        /**
         * 定義済み壁紙リストを初期化する.<br>
         * 既に初期化済みであれば何もしない.<br>
@@ -147,7 +148,7 @@ public class WallpaperDialog extends JDialog {
                }
                predefinedWallpapers.addAll(PredefinedWallpaper.getPredefinedWallpapers());
        }
-       
+
        /**
         * このダイアログのコンポーネントを初期化します.<br>
         */
@@ -156,7 +157,7 @@ public class WallpaperDialog extends JDialog {
                        .getLocalizedProperties(WallpaperDialog.STRINGS_RESOURCE);
 
                setTitle(strings.getProperty("title"));
-               
+
                Container contentPane = getContentPane();
                contentPane.setLayout(new BorderLayout(3, 3));
                getRootPane().setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
@@ -164,15 +165,21 @@ public class WallpaperDialog extends JDialog {
                JPanel wallpaperPanel = createWallpaperChoosePanel(strings);
                JPanel bgcolorPanel = createBgColorPanel(strings);
                JPanel btnPanel = createButtonPanel(strings);
-               
+
                contentPane.add(bgcolorPanel, BorderLayout.NORTH);
                contentPane.add(wallpaperPanel, BorderLayout.CENTER);
                contentPane.add(btnPanel, BorderLayout.SOUTH);
-               
-               setSize(400, 350);
+
+               Dimension dim = new Dimension(400, 350);
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(this);
+               if (scaleSupport != null) {
+                       // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する
+                       dim = scaleSupport.manualScaled(dim);
+               }
+               setSize(dim);
                setLocationRelativeTo(getParent());
        }
-       
+
        private JPanel createButtonPanel(Properties strings) {
                JPanel btnPanel = new JPanel();
 
@@ -188,14 +195,14 @@ public class WallpaperDialog extends JDialog {
                                onCancel();
                        }
                };
-               
+
                JButton btnOK = new JButton(actOK);
                JButton btnCancel = new JButton(actCancel);
 
                BoxLayout bl = new BoxLayout(btnPanel, BoxLayout.LINE_AXIS);
                btnPanel.setLayout(bl);
                btnPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 45));
-               
+
                btnPanel.add(Box.createHorizontalGlue());
                if (Main.isLinuxOrMacOSX()) {
                        btnPanel.add(btnCancel);
@@ -209,11 +216,11 @@ public class WallpaperDialog extends JDialog {
                // Enter/Returnキーを既定ボタンにする.
                JRootPane rootPane = getRootPane();
                rootPane.setDefaultButton(btnOK);
-               
+
                // CTRL-Wでウィンドウを非表示にする. (ESCでは非表示にしない)
                InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
                ActionMap am = rootPane.getActionMap();
-               
+
                Toolkit tk = Toolkit.getDefaultToolkit();
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeWallpaperDialog");
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeWallpaperDialog");
@@ -221,7 +228,7 @@ public class WallpaperDialog extends JDialog {
 
                return btnPanel;
        }
-       
+
        private JPanel createBgColorPanel(Properties strings) {
                JPanel bgcolorPanel = new JPanel();
 
@@ -232,12 +239,12 @@ public class WallpaperDialog extends JDialog {
 
                GridBagLayout gbl = new GridBagLayout();
                bgcolorPanel.setLayout(gbl);
-               
+
                colorBox = new ColorBox();
                colorBox.getColorDisplayPanel().setPreferredSize(new Dimension(48, 20));
 
                GridBagConstraints gbc = new GridBagConstraints();
-               
+
                gbc.ipadx = 0;
                gbc.ipady = 0;
                gbc.insets = new Insets(0, 0, 0, 0);
@@ -245,7 +252,7 @@ public class WallpaperDialog extends JDialog {
                gbc.gridheight = 1;
                gbc.anchor = GridBagConstraints.CENTER;
                gbc.fill = GridBagConstraints.NONE;
-               
+
                bgcolorPanel.add(colorBox, gbc);
 
                return bgcolorPanel;
@@ -253,25 +260,25 @@ public class WallpaperDialog extends JDialog {
 
        private JPanel createWallpaperChoosePanel(Properties strings) {
                JPanel wallpaperPanel = new JPanel();
-               
+
                wallpaperPanel.setBorder(BorderFactory.createTitledBorder(strings.getProperty("group.wallpaper")));
 
                GridBagLayout gbl = new GridBagLayout();
                wallpaperPanel.setLayout(gbl);
-               
+
                radioNone = new JRadioButton(strings.getProperty("radio.none"));
                radioFile = new JRadioButton(strings.getProperty("radio.file"));
                radioPredefined = new JRadioButton(strings.getProperty("radio.predefined"));
-               
+
                ButtonGroup btnGroup = new ButtonGroup();
                btnGroup.add(radioNone);
                btnGroup.add(radioFile);
                btnGroup.add(radioPredefined);
-               
+
                radioNone.setSelected(true);
-               
+
                txtFile = new JTextField();
-               
+
                actChooseFile = new AbstractAction(strings.getProperty("btn.chooseFile")) {
                        private static final long serialVersionUID = 1L;
                        public void actionPerformed(ActionEvent e) {
@@ -283,13 +290,13 @@ public class WallpaperDialog extends JDialog {
                listPredefinedWallpapers = new JList(predefinedWallpapers
                                .toArray(new PredefinedWallpaper[predefinedWallpapers.size()]));
                listPredefinedWallpapers.setCellRenderer(new LocalizedMessageComboBoxRender(strings));
-               
+
                SpinnerNumberModel alphaSpModel = new SpinnerNumberModel(100, 0, 100, 1);
                spinnerAlpha = new JSpinner(alphaSpModel);
-               
-               
+
+
                GridBagConstraints gbc = new GridBagConstraints();
-               
+
                gbc.ipadx = 0;
                gbc.ipady = 0;
                gbc.insets = new Insets(0, 0, 0, 0);
@@ -297,14 +304,14 @@ public class WallpaperDialog extends JDialog {
                gbc.gridheight = 1;
                gbc.anchor = GridBagConstraints.WEST;
                gbc.fill = GridBagConstraints.BOTH;
-               
+
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.gridwidth = 3;
                gbc.weightx = 0.;
 
                wallpaperPanel.add(radioNone, gbc);
-               
+
                gbc.gridx = 0;
                gbc.gridy = 1;
                gbc.gridwidth = 3;
@@ -316,23 +323,23 @@ public class WallpaperDialog extends JDialog {
                gbc.gridy = 2;
                gbc.gridwidth = 1;
                gbc.weightx = 0.;
-               
+
                wallpaperPanel.add(Box.createHorizontalStrut(20), gbc);
-               
+
                gbc.gridx = 1;
                gbc.gridy = 2;
                gbc.gridwidth = 1;
                gbc.weightx = 1.;
-               
+
                wallpaperPanel.add(txtFile, gbc);
 
                gbc.gridx = 2;
                gbc.gridy = 2;
                gbc.gridwidth = 1;
                gbc.weightx = 0.;
-               
+
                wallpaperPanel.add(btnChooseFile, gbc);
-               
+
                gbc.gridx = 0;
                gbc.gridy = 3;
                gbc.gridwidth = 3;
@@ -345,25 +352,25 @@ public class WallpaperDialog extends JDialog {
                gbc.gridwidth = 2;
                gbc.weightx = 1.;
                gbc.weighty = 1.;
-               
+
                wallpaperPanel.add(new JScrollPane(listPredefinedWallpapers), gbc);
-               
+
                gbc.gridx = 0;
                gbc.gridy = 5;
                gbc.gridwidth = 3;
                gbc.weightx = 0.;
                gbc.weighty = 0.;
                gbc.insets = new Insets(5, 0, 0, 0);
-               
+
                wallpaperPanel.add(new JLabel(
                                strings.getProperty("label.wallpaperImageAlpha")), gbc);
-               
-               
+
+
                JPanel alphaPanel = new JPanel(new BorderLayout(3, 3));
                alphaPanel.setBorder(BorderFactory.createEmptyBorder(3, 0, 3, 0));
                alphaPanel.add(spinnerAlpha, BorderLayout.CENTER);
                alphaPanel.add(new JLabel("%"), BorderLayout.EAST);
-               
+
                gbc.gridx = 1;
                gbc.gridy = 6;
                gbc.gridwidth = 2;
@@ -375,7 +382,7 @@ public class WallpaperDialog extends JDialog {
                gbc.anchor = GridBagConstraints.WEST;
 
                wallpaperPanel.add(alphaPanel, gbc);
-               
+
                // リスナ
                listPredefinedWallpapers.addListSelectionListener(new ListSelectionListener() {
                        public void valueChanged(ListSelectionEvent e) {
@@ -388,7 +395,7 @@ public class WallpaperDialog extends JDialog {
 
        protected void onChooseFile() {
                File selectedFile = wallpaperInfo.getFile();
-               
+
                final JFileChooser fileChooser = new ImagePreviewFileChooser();
                fileChooser.setSelectedFile(selectedFile);
 
@@ -400,16 +407,16 @@ public class WallpaperDialog extends JDialog {
                txtFile.setText(selectedFile == null ? "" : selectedFile.getPath());
                radioFile.setSelected(selectedFile != null);
        }
-       
+
        /**
         * 壁紙情報インスタンスの内容でコンポーネントを設定する.
         */
        protected void applyByWallpaperInfo() {
-               
+
                // ファイル
                File imageFile = wallpaperInfo.getFile();
                txtFile.setText(imageFile == null ? "" : imageFile.getPath());
-               
+
                // リソース
                PredefinedWallpaper selectedPredefinedWp = null;
                String resource = wallpaperInfo.getResource();
@@ -419,20 +426,20 @@ public class WallpaperDialog extends JDialog {
                        }
                }
                listPredefinedWallpapers.setSelectedValue(selectedPredefinedWp, true);
-               
+
                // 透過率
                int alphaInt = (int)(wallpaperInfo.getAlpha() * 100);
                spinnerAlpha.setValue(alphaInt);
-               
+
                // 背景色
                Color bgColor = wallpaperInfo.getBackgroundColor();
                colorBox.setColorKey(bgColor);
-               
+
                // タイプ
                WallpaperResourceType typ = wallpaperInfo.getType();
                if (typ == WallpaperResourceType.FILE) {
                        radioFile.setSelected(true);
-               
+
                } else if (typ == WallpaperResourceType.PREDEFINED) {
                        radioPredefined.setSelected(true);
 
@@ -458,7 +465,7 @@ public class WallpaperDialog extends JDialog {
                } else if (radioPredefined.isSelected()) {
                        // リソース選択
                        typ = WallpaperResourceType.PREDEFINED;
-               
+
                } else {
                        // それ以外は選択なし
                        typ = WallpaperResourceType.NONE;
@@ -474,31 +481,31 @@ public class WallpaperDialog extends JDialog {
                        }
                }
                wallpaperInfo.setFile(selectedFile);
-               
+
                // 定義済みリソースの現在の選択
                PredefinedWallpaper predefinedWp =
                        (PredefinedWallpaper) listPredefinedWallpapers.getSelectedValue();
                wallpaperInfo.setResource(predefinedWp == null ?
                                null : predefinedWp.getResource());
-               
+
                // タイプの設定
                wallpaperInfo.setType(typ);
-               
+
                // 背景画像の透過率
                int alphaInt = (Integer) spinnerAlpha.getValue();
                float alpha = (float) alphaInt / 100.f;
                wallpaperInfo.setAlpha(alpha);
-               
+
                // 背景色
                Color bgColor = colorBox.getColorKey();
                wallpaperInfo.setBackgroundColor(bgColor);
-               
+
                return wallpaperInfo;
        }
-       
+
        protected void onOK() {
                WallpaperInfo wallpaperInfo = createWallpaperInfo();
-               
+
                if (!checkValidate(wallpaperInfo)) {
                        return;
                }
@@ -506,12 +513,12 @@ public class WallpaperDialog extends JDialog {
                this.wallpaperInfo = wallpaperInfo;
                dispose();
        }
-       
+
        protected void onCancel() {
                wallpaperInfo = null;
                dispose();
        }
-       
+
        protected boolean checkValidate(WallpaperInfo wallpaperInfo) {
                String messageid = null;
                WallpaperResourceType typ = wallpaperInfo.getType();
@@ -530,7 +537,7 @@ public class WallpaperDialog extends JDialog {
                                messageid = "error.require.resource";
                        }
                }
-               
+
                if (messageid != null) {
                        Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
                                .getLocalizedProperties(WallpaperDialog.STRINGS_RESOURCE);
@@ -538,21 +545,21 @@ public class WallpaperDialog extends JDialog {
                        String message = strings.getProperty(messageid);
                        JOptionPane.showMessageDialog(this, message, "ERROR", JOptionPane.ERROR_MESSAGE);
                }
-               
+
                return messageid == null;
        }
-       
+
        public void setWallpaperInfo(WallpaperInfo wallpaperInfo) {
                if (wallpaperInfo == null) {
                        wallpaperInfo = new WallpaperInfo();
                }
                this.wallpaperInfo = wallpaperInfo;
        }
-       
+
        public WallpaperInfo getWallpaperInfo() {
                return wallpaperInfo;
        }
-       
+
        /**
         * ダイアログを表示し、その結果を返す.<br>
         * キャンセルされた場合はnullが返される.<br>
diff --git a/src/main/java/charactermanaj/ui/util/ScaleSupport.java b/src/main/java/charactermanaj/ui/util/ScaleSupport.java
new file mode 100644 (file)
index 0000000..c5aa7f8
--- /dev/null
@@ -0,0 +1,90 @@
+package charactermanaj.ui.util;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.Toolkit;
+import java.awt.geom.AffineTransform;
+
+/**
+ * スクリーンのスケールを取得する。
+ *
+ * Java8であれば自動スケールがかかっていないので、マニュアルでスケール倍して座標を補正する。
+ * Java11であれば自動スケールがかかっている。
+ */
+public class ScaleSupport {
+
+       private static final float scale;
+
+       private double scaleX;
+
+       private double scaleY;
+
+       private double manualScaleX;
+
+       private double manualScaleY;
+
+       static {
+               Toolkit tk = Toolkit.getDefaultToolkit();
+               int resolution = tk.getScreenResolution();
+
+               float dpi = System.getProperty("os.name").startsWith("Windows") ? 96f : 72f;
+               scale = resolution / dpi;
+       }
+
+       private ScaleSupport(double scaleX, double scaleY) {
+               this.scaleX = scaleX;
+               this.scaleY = scaleY;
+               manualScaleX = scale / scaleX;
+               manualScaleY = scale / scaleX;
+       }
+
+       /**
+        * コンポーネントのグラフィクス設定からスケールを取得する。
+        * まだ画面に関連付けられていない場合はnullを返す。
+        * @param comp
+        * @return
+        */
+       public static ScaleSupport getInstance(Component comp) {
+               GraphicsConfiguration gconf = comp.getGraphicsConfiguration();
+               if (gconf == null) {
+                       return null;
+               }
+               return getInstance(gconf);
+       }
+
+       public static ScaleSupport getDefault() {
+               GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
+               GraphicsDevice gdev = genv.getDefaultScreenDevice();
+               return getInstance(gdev.getDefaultConfiguration());
+       }
+
+       public static ScaleSupport getInstance(GraphicsConfiguration gconf) {
+               AffineTransform trans = gconf.getDefaultTransform();
+               double scaleX = trans.getScaleX();
+               double scaleY = trans.getScaleY();
+               return new ScaleSupport(scaleX, scaleY);
+       }
+
+       public double getDefaultScaleX() {
+               return scaleX;
+       }
+
+       public double getDefaultScaleY() {
+               return scaleY;
+       }
+
+       public double getManualScaleX() {
+               return manualScaleX;
+       }
+
+       public double getManualScaleY() {
+               return manualScaleY;
+       }
+
+       public Dimension manualScaled(Dimension dim) {
+               return new Dimension((int) (dim.getWidth() * manualScaleX), (int) (dim.getHeight() * manualScaleY));
+       }
+}
\ No newline at end of file
index c8205a3..624d4e1 100644 (file)
@@ -20,6 +20,8 @@ import javax.swing.JOptionPane;
 import javax.swing.JScrollPane;
 import javax.swing.JTextArea;
 
+import charactermanaj.ui.util.ScaleSupport;
+
 /**
  * 例外を表示するダイアログ.<br>
  * ログにも記録される.<br>
@@ -77,7 +79,6 @@ public final class ErrorMessageHelper {
                JOptionPane pane = new JOptionPane(scr, JOptionPane.ERROR_MESSAGE);
 
                Window window = getWindowForComponent(parent);
-               System.out.println("window=" + window);
 
                final JDialog dialog;
                String title = "ERROR";
@@ -95,7 +96,10 @@ public final class ErrorMessageHelper {
                contentPane.add(pane, BorderLayout.CENTER);
                dialog.setResizable(true);
 
-               dialog.pack();
+               ScaleSupport scaleSupport = ScaleSupport.getInstance(dialog);
+               Dimension wnddim = dialog.getPreferredSize();
+               wnddim = scaleSupport.manualScaled(wnddim);
+               dialog.setSize(wnddim);
                dialog.setLocationRelativeTo(parent);
 
         pane.addPropertyChangeListener(JOptionPane.VALUE_PROPERTY, new PropertyChangeListener() {