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;
// デフォルトのフォントサイズ、0以下の場合はシステム標準のまま
int defFontSize = appConfig.getDefaultFontSize();
+ // フォントサイズを画面のスケールの補正にあわせる
+ if (defFontSize > 0) {
+ ScaleSupport scaleSupport = ScaleSupport.getDefault();
+ defFontSize = (int)(defFontSize * scaleSupport.getManualScaleY());
+ }
+
// UIデフォルトのフォント設定で、優先フォント以外のフォントファミリが指定されているものを
// すべて最優先フォントファミリに設定する.
// また、設定されたフォントサイズが0よりも大きければ、そのサイズに設定する.
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;
/**
* Aboutボックスを表示する.
- *
+ *
* @author seraphy
*/
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();
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() {
setText(getSysInfoText());
}
};
-
+
tabs.addTab("About", aboutPanel);
tabs.addTab("System", sysInfoPanel);
}
}
});
-
+
JOptionPane.showMessageDialog(parent, tabs, "About", JOptionPane.INFORMATION_MESSAGE);
}
-
+
protected JPanel createAboutPanel() {
LocalizedTextResource textResource = new LocalizedTextResource() {
@Override
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() {
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>");
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 {
} 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();
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();
} catch (Exception ex) {
buf.append(escape(ex.toString()));
}
-
+
// 環境変数の取得
-
+
buf.append("<h2>System Environments</h2>");
try {
TreeMap<String, String> envMap = new TreeMap<String, String>(); // 環境変数名のアルファベット順にソート
buf.append("</html>");
return buf.toString();
}
-
+
protected String escape(String value) {
if (value == null) {
return null;
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) {
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"));
} finally {
os.close();
}
-
+
} catch (Exception ex) {
ErrorMessageHelper.showErrorDialog(this, ex);
}
}
-
+
}
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;
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));
}
}
}
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
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
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;
// 表示
- 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);
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) {
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()) {
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;
presetTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
- presetTableModel.adjustColumnModel(presetTable.getColumnModel());
add(new JScrollPane(presetTable), BorderLayout.CENTER);
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) {
};
}
- 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));
}
}
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));
}
}
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;
* @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();
}
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() {
return null;
}
};
+
partsSelectTable.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
partsSelectTable.repaint();
}
});
+
+ // 行の高さをフォントの高さにする
+ partsSelectTable.setRowHeight((int)(partsSelectTable.getFont().getSize() * 1.2));
+
final JPopupMenu partsSelectTablePopupMenu = new JPopupMenu();
Action actDeselectAll = new AbstractAction(
strings.getProperty("popupmenu.deselectall")) {
// デフォルトのパネル幅を設定する.
Dimension dim = new Dimension(200, 200);
+ dim = scaleSupport.manualScaled(dim);
setPreferredSize(dim);
// パネルの初期サイズ
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;
// 表示
- 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);
}
- 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));
}
}
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) {
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) {
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));
}
}
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;
popupMenu.add(actSelectUsedParts);
presetTable.setComponentPopupMenu(popupMenu);
-
presetTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
- presetTableModel.adjustColumnModel(presetTable.getColumnModel());
add(new JScrollPane(presetTable), BorderLayout.CENTER);
}
@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;
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));
}
}
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;
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;
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());
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);
}
}
}
- 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));
}
}
import charactermanaj.model.ObservableList;
import charactermanaj.model.PartsCategory;
import charactermanaj.ui.model.SimpleComboBoxModel;
+import charactermanaj.ui.util.ScaleSupport;
import charactermanaj.util.LocalizedResourcePropertyLoader;
/**
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;
* カラム幅を設定する。
* @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;
}
/**
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();
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;
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()) {
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);
import charactermanaj.model.CharacterData;
import charactermanaj.model.PartsSet;
+import charactermanaj.ui.util.ScaleSupport;
import charactermanaj.util.LocalizedResourcePropertyLoader;
import charactermanaj.util.UIHelper;
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);
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();
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;
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;
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
setTitle(strings.getProperty("title"));
Container contentPane = getContentPane();
-
+
// パーツリストテーブル
JPanel partsListPanel = new JPanel();
partsListPanel.setBorder(BorderFactory.createCompoundBorder(
GridBagLayout partsListPanelLayout = new GridBagLayout();
partsListPanel.setLayout(partsListPanelLayout);
-
+
partsManageTableModel = new PartsManageTableModel();
partsManageTable = new JTable(partsManageTableModel) {
private static final long serialVersionUID = 1L;
};
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()) {
}
}
});
-
+
partsManageTableModel.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
onTableDataChange(e.getFirstRow(), e.getLastRow());
}
});
-
+
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
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) {
onSortByTimestamp();
}
};
-
+
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridheight = 1;
popupMenu.add(new JSeparator());
popupMenu.add(actApplyAllVersion);
popupMenu.add(actApplyAllDownloadURL);
-
+
partsManageTable.setComponentPopupMenu(popupMenu);
-
+
// 作者情報パネル
JPanel authorPanel = new JPanel();
authorPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
.createTitledBorder(strings.getProperty("author.info"))));
GridBagLayout authorPanelLayout = new GridBagLayout();
authorPanel.setLayout(authorPanelLayout);
-
+
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridheight = 1;
if (!DesktopUtilities.isSupported()) {
actBrowseHomepage.setEnabled(false);
}
-
+
txtAuthor.getDocument().addDocumentListener(new DocumentListener() {
public void removeUpdate(DocumentEvent e) {
onEditAuthor();
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) {
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.;
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);
// モデル構築
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();
ErrorMessageHelper.showErrorDialog(this, ex);
}
}
-
+
protected void onTableDataChange(int firstRow, int lastRow) {
onChangeSelection();
}
-
+
protected void onApplyAllLastModified() {
int[] selRows = partsManageTable.getSelectedRows();
if (selRows.length == 0) {
return;
}
}
-
+
PartsManageTableRow firstRow = partsManageTableModel.getRow(selRows[0]);
String downloadURL = firstRow.getDownloadURL();
if (downloadURL == null) {
// キャンセルされたか、内容に変化ない場合は何もしない
return;
}
-
+
for (int selRow : selRows) {
PartsManageTableRow row = partsManageTableModel.getRow(selRow);
row.setDownloadURL(downloadURL_new);
}
partsManageTableModel.fireTableRowsUpdated(selRows[0], selRows[selRows.length - 1]);
}
-
+
protected void onApplyAllVersion() {
Toolkit tk = Toolkit.getDefaultToolkit();
int[] selRows = partsManageTable.getSelectedRows();
tk.beep();
return;
}
-
+
for (int selRow : selRows) {
PartsManageTableRow row = partsManageTableModel.getRow(selRow);
row.setVersion(version_new);
}
partsManageTableModel.fireTableRowsUpdated(selRows[0], selRows[selRows.length - 1]);
}
-
+
protected void onEditHomepage() {
try {
if (!authorEditSemaphore.tryAcquire()) {
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);
updated = false;
dispose();
}
-
+
protected void onBrosweHomepage() {
Toolkit tk = Toolkit.getDefaultToolkit();
String homepage = txtHomepage.getText();
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();
// 作者ごとのホームページ情報の取得
}
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 {
ErrorMessageHelper.showErrorDialog(this, ex);
return;
}
-
+
updated = true;
dispose();
}
/**
* パーツ管理情報が更新されたか?
- *
+ *
* @return 更新された場合はtrue、そうでなければfalse
*/
public boolean isUpdated() {
}
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,
this.localizedName = partsIdentifier.getLocalizedPartsName();
this.timestamp = new Timestamp(partsSpec.getPartsFiles().lastModified());
-
+
this.lastModified = lastModified;
-
+
PartsAuthorInfo autherInfo = partsSpec.getAuthorInfo();
if (autherInfo != null) {
author = autherInfo.getAuthor();
downloadURL = partsSpec.getDownloadURL();
version = partsSpec.getVersion();
}
-
+
public PartsIdentifier getPartsIdentifier() {
return partsIdentifier;
}
-
+
public Timestamp getTimestamp() {
return timestamp;
}
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;
}
}
}
-
+
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));
}
}
Columns column = Columns.values()[columnIndex];
return column.getValue(row);
}
-
+
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
PartsManageTableRow row = getRow(rowIndex);
// 変更通知
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();
.getPartsSpecMap(partsCategory).entrySet()) {
PartsIdentifier partsIdentifier = entry.getKey();
PartsSpec partsSpec = entry.getValue();
-
+
// パーツ管理情報ファイルから、パーツ管理情報を設定した時点の
// ファイルサイズや更新日時などを読み取る.
PartsKey partsKey = new PartsKey(partsIdentifier);
* ホームページはAuthorに対して1つであるが、Authorが自由編集可能であるため便宜的にRowに持たせている.<br>
* 結果として同じAuthorに対して同じ値を設定する必要がある.<br>
* ホームページはテーブルに表示されないのでリスナーへの通知は行わない.<br>
- *
+ *
* @param author
* 作者、空またはnullは何もしない.
* @param homepage
/**
* ホームページを取得する.<br>
* 該当する作者がないか、作者がnullまたは空の場合は常にnullを返す.<br>
- *
+ *
* @param author
* 作者
* @return ホームページ、またはnull
}
return null;
}
-
+
protected static final Comparator<PartsManageTableRow> NAMED_SORTER
= new Comparator<PartsManageTableRow>() {
public int compare(PartsManageTableRow o1, PartsManageTableRow o2) {
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) {
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;
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();
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();
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));
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();
return comp;
}
};
- partssetsTableModel.adjustColumnModel(partssetsTable.getColumnModel());
+ partssetsTableModel.adjustColumnModel(partssetsTable.getColumnModel(), scaleSupport.getManualScaleX());
partssetsTable.setRowHeight(layersTable.getRowHeight() + 4);
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
return comp;
}
};
- recommendationsTableModel.adjustColumnModel(recommendationsTable.getColumnModel());
+ recommendationsTableModel.adjustColumnModel(recommendationsTable.getColumnModel(), scaleSupport.getManualScaleX());
recommendationsTable.setRowHeight(layersTable.getRowHeight() + 4);
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();
contentPane.add(tabbedPane, BorderLayout.CENTER);
- setSize(500, 500);
+ Dimension dim = new Dimension(500, 500);
+ dim = scaleSupport.manualScaled(dim);
+ setSize(dim);
setLocationRelativeTo(parent);
updateUIState();
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));
}
}
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));
}
}
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));
}
}
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));
}
}
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;
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(
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();
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));
}
}
import java.awt.BorderLayout;
import java.awt.Container;
+import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
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
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;
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;
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;
}
});
searchCondPanel.add(btnClear, gbc);
-
+
// 検索結果
JPanel searchResult = new JPanel(new BorderLayout());
searchResult.setBorder(BorderFactory.createCompoundBorder(
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
}
}
});
-
+
// テーブルのキーイベント
ActionMap tblAm = searchPartsTable.getActionMap();
InputMap tblIm = searchPartsTable.getInputMap();
onSelect();
}
});
-
+
JPanel btnPanel = new JPanel();
btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 10));
GridBagLayout btnPanelLayout = new GridBagLayout();
});
btnPanel.add(btnSelect, gbc);
searchResult.add(btnPanel, BorderLayout.SOUTH);
-
-
+
+
// 検索条件の入力が変更されたことを検知するリスナの登録
-
+
txtPartsName.getDocument().addDocumentListener(new DocumentListener() {
public void removeUpdate(DocumentEvent e) {
onChangeCondition();
onChangeCondition();
}
});
-
+
ActionListener changeListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
onChangeCondition();
};
cmbAuthors.addActionListener(changeListener);
cmbCategories.addActionListener(changeListener);
-
+
// ESCキーとCTRL-Wで閉じる.
Toolkit tk = Toolkit.getDefaultToolkit();
JRootPane rootPane = getRootPane();
onClose();
}
});
-
+
// ウィンドウがアクティブになったときに検索フィールドにフォーカスをあてる
addWindowFocusListener(new WindowAdapter() {
public void windowGainedFocus(WindowEvent e) {
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();
}
}
}
-
- 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>
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;
});
searchPartsTableModel.initModel(partsIdentifiers);
}
-
+
}
class SearchPartsTableModel extends AbstractTableModelWithComboBoxModel<Map.Entry<PartsIdentifier, PartsSpec>> {
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"),
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();
}
return "";
}
-
+
public void initModel(List<Map.Entry<PartsIdentifier, PartsSpec>> partsIdentifiers) {
clear();
if (partsIdentifiers != null) {
}
}
}
-
+
}
package charactermanaj.ui;
-import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
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;
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;
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) {
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() {
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;
import charactermanaj.Main;
import charactermanaj.graphics.io.UkagakaImageConverter;
+import charactermanaj.ui.util.ScaleSupport;
import charactermanaj.util.LocalizedResourcePropertyLoader;
/**
* キャプション
*/
private TextField caption = new TextField();
-
+
/**
* キャンセル
*/
private AbstractAction actCancel;
-
+
/**
* 保存(デフォルトアクション)
*/
private AbstractAction actSave;
-
+
/**
* プレビュー(PNG)
*/
private SamplePicturePanel opaqueImagePanel = new SamplePicturePanel();
-
+
/**
* プレビュー(PNA)
*/
* 透過色キー表示ボックス
*/
private ColorBox colorBox = new ColorBox();
-
+
/**
* エクスポート対象の元イメージ.
*/
private BufferedImage originalImage;
-
+
/**
* 透過色をマニュアルとするか?
*/
private boolean manualTransparentColorKey;
-
+
/**
* 透過キー自動モード
*/
* 透過キー手動選択モード
*/
private JRadioButton radioManual;
-
+
/**
* 上書きモードチェックボックス
*/
private JCheckBox chkOverwriteOption;
-
+
/**
* 終了コード
*/
private Object result;
-
+
/**
* 保存ボタンアクションリスナ.<br>
*/
private ActionListener saveActionListener;
-
+
/**
* 上書きオプションの表示フラグ
*/
private boolean showOverwriteOption;
-
+
/**
* 伺か用PNG/PNA出力設定ダイアログを構築する.
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);
* 伺か用PNG/PNA出力設定ダイアログを構築する.
* @param parent 親フレーム
* @param saveActionListener 保存ボタンアクション
- * @param overwriteOption 上書きオプションの表示
+ * @param overwriteOption 上書きオプションの表示
*/
public UkagakaConvertDialog(JFrame parent, ActionListener saveActionListener, boolean overwriteOption) {
super(parent, true);
result = null;
}
});
-
+
try {
initComponent();
* コンポーネントの初期化
*/
private void initComponent() {
-
+
Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
.getLocalizedProperties(STRINGS_RESOURCE);
onSave();
}
};
-
+
JButton btnCancel = new JButton(actCancel);
JButton btnSave = new JButton(actSave);
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)
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) {
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;
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;
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) {
}
});
}
-
+
/**
* 出力するイメージを設定する.
* @param img イメージ(TYPE_INT_ARGBのみ)
if (img.getType() != BufferedImage.TYPE_INT_ARGB) {
throw new IllegalArgumentException("TYPE_INT_ARGB以外は指定できません。");
}
-
+
if (colorKey == null) {
colorKey = Color.GREEN;
}
rebuildImage();
}
-
+
public BufferedImage getOpaqueImage() {
return opaqueImagePanel.getSamplePictrue();
}
-
+
public BufferedImage getAlphaImage() {
return alphaImagePanel.getSamplePictrue();
}
-
+
public void setAutoTransparentColor(boolean mode) {
if (mode) {
radioAuto.setSelected(true);
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("");
caption.setVisible(true);
}
}
-
+
public String getCaption() {
return caption.getText();
}
-
+
/**
* 透過色のマニュアル選択.<br>
*/
rebuildImage();
}
}
-
+
/**
* 伺か用のPNG/PNA画像を生成してプレビューに設定します.<br>
*/
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);
}
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;
* 壁紙情報
*/
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 親フレーム
onCancel();
};
});
-
+
initPredefinedWallpapers();
initComponent();
-
+
} catch (RuntimeException ex) {
dispose();
throw ex;
}
}
-
+
/**
* 定義済み壁紙リストを初期化する.<br>
* 既に初期化済みであれば何もしない.<br>
}
predefinedWallpapers.addAll(PredefinedWallpaper.getPredefinedWallpapers());
}
-
+
/**
* このダイアログのコンポーネントを初期化します.<br>
*/
.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));
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();
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);
// 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");
return btnPanel;
}
-
+
private JPanel createBgColorPanel(Properties strings) {
JPanel bgcolorPanel = new JPanel();
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);
gbc.gridheight = 1;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.NONE;
-
+
bgcolorPanel.add(colorBox, gbc);
return bgcolorPanel;
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) {
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);
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;
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;
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;
gbc.anchor = GridBagConstraints.WEST;
wallpaperPanel.add(alphaPanel, gbc);
-
+
// リスナ
listPredefinedWallpapers.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
protected void onChooseFile() {
File selectedFile = wallpaperInfo.getFile();
-
+
final JFileChooser fileChooser = new ImagePreviewFileChooser();
fileChooser.setSelectedFile(selectedFile);
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();
}
}
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);
} else if (radioPredefined.isSelected()) {
// リソース選択
typ = WallpaperResourceType.PREDEFINED;
-
+
} else {
// それ以外は選択なし
typ = WallpaperResourceType.NONE;
}
}
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;
}
this.wallpaperInfo = wallpaperInfo;
dispose();
}
-
+
protected void onCancel() {
wallpaperInfo = null;
dispose();
}
-
+
protected boolean checkValidate(WallpaperInfo wallpaperInfo) {
String messageid = null;
WallpaperResourceType typ = wallpaperInfo.getType();
messageid = "error.require.resource";
}
}
-
+
if (messageid != null) {
Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
.getLocalizedProperties(WallpaperDialog.STRINGS_RESOURCE);
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>
--- /dev/null
+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
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
+import charactermanaj.ui.util.ScaleSupport;
+
/**
* 例外を表示するダイアログ.<br>
* ログにも記録される.<br>
JOptionPane pane = new JOptionPane(scr, JOptionPane.ERROR_MESSAGE);
Window window = getWindowForComponent(parent);
- System.out.println("window=" + window);
final JDialog dialog;
String title = "ERROR";
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() {