Swing/_SandBox のバックアップ(No.86)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/_SandBox へ行く。
- 1 (2014-05-16 (金) 16:45:38)
- 2 (2014-07-13 (日) 08:50:46)
- 3 (2014-08-17 (日) 23:30:27)
- 4 (2014-08-20 (水) 14:45:54)
- 5 (2014-08-24 (日) 21:25:31)
- 6 (2014-08-25 (月) 15:25:34)
- 7 (2014-08-31 (日) 23:19:21)
- 8 (2014-09-14 (日) 22:17:53)
- 9 (2014-09-15 (月) 00:00:44)
- 10 (2014-09-15 (月) 20:50:51)
- 11 (2014-09-16 (火) 00:40:32)
- 12 (2014-09-20 (土) 00:16:45)
- 13 (2014-09-21 (日) 02:29:11)
- 14 (2014-09-21 (日) 17:06:36)
- 15 (2014-09-21 (日) 23:48:13)
- 16 (2014-09-23 (火) 18:55:40)
- 17 (2014-09-24 (水) 16:38:38)
- 18 (2014-09-28 (日) 19:20:51)
- 19 (2014-09-29 (月) 00:01:02)
- 20 (2014-09-29 (月) 03:28:21)
- 21 (2014-10-03 (金) 23:06:20)
- 22 (2014-10-05 (日) 10:18:20)
- 23 (2014-10-05 (日) 15:32:20)
- 24 (2014-10-05 (日) 17:12:07)
- 25 (2014-10-06 (月) 00:00:55)
- 26 (2014-10-06 (月) 20:55:14)
- 27 (2014-10-09 (木) 19:56:30)
- 28 (2014-10-14 (火) 20:46:13)
- 29 (2014-10-15 (水) 01:49:13)
- 30 (2014-10-16 (木) 20:53:50)
- 31 (2014-10-16 (木) 22:00:48)
- 32 (2014-10-20 (月) 06:29:35)
- 33 (2014-10-27 (月) 00:00:24)
- 34 (2014-11-01 (土) 00:46:09)
- 35 (2014-11-08 (土) 01:41:12)
- 36 (2014-11-25 (火) 03:03:31)
- 37 (2014-11-28 (金) 20:27:21)
- 38 (2014-11-29 (土) 21:31:57)
- 39 (2014-12-01 (月) 00:13:01)
- 40 (2014-12-12 (金) 15:14:25)
- 41 (2015-01-06 (火) 15:16:11)
- 42 (2015-01-07 (水) 21:09:19)
- 43 (2015-01-26 (月) 12:41:59)
- 44 (2015-02-03 (火) 19:33:06)
- 45 (2015-02-09 (月) 00:10:17)
- 46 (2015-03-04 (水) 18:53:15)
- 47 (2015-03-08 (日) 21:25:43)
- 48 (2015-03-11 (水) 18:31:25)
- 49 (2015-03-22 (日) 23:03:35)
- 50 (2015-03-29 (日) 18:58:00)
- 51 (2015-03-30 (月) 00:03:38)
- 52 (2015-05-07 (木) 22:08:19)
- 53 (2015-05-28 (木) 21:20:29)
- 54 (2015-06-01 (月) 00:25:32)
- 55 (2015-06-07 (日) 17:14:32)
- 56 (2015-06-08 (月) 00:03:30)
- 57 (2015-06-09 (火) 19:41:54)
- 58 (2015-06-12 (金) 15:52:05)
- 59 (2015-06-13 (土) 14:01:40)
- 60 (2015-06-14 (日) 23:59:44)
- 61 (2015-06-29 (月) 05:01:12)
- 62 (2015-06-30 (火) 18:26:16)
- 63 (2015-07-03 (金) 14:39:33)
- 64 (2015-07-06 (月) 02:03:05)
- 65 (2015-07-06 (月) 15:18:14)
- 66 (2015-07-10 (金) 17:45:32)
- 67 (2015-07-11 (土) 03:44:35)
- 68 (2015-07-13 (月) 02:34:04)
- 69 (2015-07-20 (月) 03:20:45)
- 70 (2015-08-03 (月) 02:55:10)
- 71 (2015-08-17 (月) 01:08:50)
- 72 (2015-10-05 (月) 00:12:28)
- 73 (2015-10-06 (火) 17:00:53)
- 74 (2015-10-12 (月) 05:29:41)
- 75 (2016-03-29 (火) 12:57:09)
- 76 (2016-03-30 (水) 15:52:31)
- 77 (2016-03-31 (木) 14:12:28)
- 78 (2016-03-31 (木) 18:13:10)
- 79 (2016-04-07 (木) 15:01:59)
- 80 (2016-04-08 (金) 15:20:50)
- 81 (2016-04-11 (月) 12:31:17)
- 82 (2016-04-11 (月) 14:05:47)
- 83 (2016-04-25 (月) 18:53:25)
- 84 (2016-05-18 (水) 19:58:53)
- 85 (2016-06-03 (金) 13:38:40)
- 86 (2016-06-07 (火) 17:29:43)
- 87 (2016-06-24 (金) 15:14:34)
- 88 (2016-09-12 (月) 01:21:33)
- 89 (2016-09-25 (日) 20:33:55)
- 90 (2016-09-26 (月) 15:23:44)
- 91 (2016-09-28 (水) 16:57:57)
- 92 (2017-02-01 (水) 19:07:25)
- 93 (2017-02-03 (金) 16:31:15)
- 94 (2017-02-06 (月) 14:21:53)
- 95 (2017-02-06 (月) 16:14:44)
- 96 (2017-02-09 (木) 17:53:06)
- 97 (2017-03-24 (金) 18:22:57)
- 98 (2017-04-04 (火) 14:13:45)
- 99 (2017-04-07 (金) 13:51:51)
- 100 (2017-04-12 (水) 18:50:51)
- 101 (2017-04-24 (月) 14:36:31)
- 102 (2017-05-29 (月) 15:39:15)
- 103 (2017-06-05 (月) 13:57:54)
- 104 (2017-06-07 (水) 15:35:06)
- 105 (2017-07-05 (水) 20:11:10)
- 106 (2017-07-07 (金) 17:01:03)
- 107 (2017-07-12 (水) 19:03:10)
- 108 (2017-08-03 (木) 16:17:03)
- 109 (2017-08-07 (月) 16:00:50)
- 110 (2017-10-02 (月) 13:49:13)
- 111 (2017-10-27 (金) 16:26:13)
- 112 (2017-11-02 (木) 15:34:40)
- 113 (2017-11-21 (火) 19:19:21)
- 114 (2017-12-11 (月) 16:29:32)
- 115 (2017-12-11 (月) 18:06:42)
- 116 (2017-12-18 (月) 14:48:47)
- 117 (2018-01-08 (月) 21:15:51)
- 118 (2018-01-15 (月) 14:44:37)
- 119 (2018-01-22 (月) 16:10:11)
- 120 (2018-01-22 (月) 18:19:57)
- 121 (2018-02-27 (火) 14:35:27)
- 122 (2018-04-02 (月) 18:59:23)
- 123 (2018-06-18 (月) 16:29:32)
- 124 (2018-07-30 (月) 16:03:21)
- 125 (2018-08-02 (木) 16:00:29)
- 126 (2018-08-02 (木) 21:25:02)
- 127 (2019-03-04 (月) 22:20:31)
- 128 (2019-03-05 (火) 18:50:53)
- 129 (2019-03-08 (金) 15:39:01)
- 130 (2019-03-11 (月) 15:20:26)
- 131 (2019-03-18 (月) 19:31:43)
- 132 (2019-03-29 (金) 16:33:32)
- 133 (2019-04-01 (月) 15:14:20)
- 134 (2019-09-09 (月) 15:53:47)
- 135 (2019-10-07 (月) 21:37:43)
- 136 (2019-10-17 (木) 20:46:06)
- 137 (2019-11-01 (金) 17:04:13)
- 138 (2019-11-11 (月) 15:09:11)
- 139 (2019-11-29 (金) 15:35:17)
- 140 (2019-12-02 (月) 14:51:31)
- 141 (2020-02-03 (月) 18:52:30)
- 142 (2020-06-14 (日) 15:14:28)
- 143 (2020-06-15 (月) 03:23:01)
- 144 (2020-08-09 (日) 16:03:42)
- 145 (2020-12-23 (水) 13:05:07)
- 146 (2021-01-04 (月) 20:32:52)
- 147 (2021-01-18 (月) 01:10:44)
- 148 (2021-01-25 (月) 04:44:53)
- 149 (2021-02-01 (月) 01:38:48)
- 150 (2021-04-26 (月) 19:49:35)
- 151 (2021-07-07 (水) 21:15:57)
- 152 (2021-07-10 (土) 01:36:49)
- 153 (2021-07-10 (土) 03:26:25)
- 154 (2021-07-17 (土) 23:21:07)
- 155 (2021-07-18 (日) 02:02:13)
- 156 (2021-07-18 (日) 22:15:11)
- 157 (2021-07-19 (月) 02:46:39)
- 158 (2021-08-21 (土) 15:36:27)
- 159 (2021-11-01 (月) 01:09:24)
- 160 (2021-12-06 (月) 00:42:13)
- 161 (2022-08-05 (金) 15:59:15)
- 162 (2022-08-20 (土) 22:15:25)
- 163 (2022-09-26 (月) 01:40:57)
- 164 (2022-10-02 (日) 02:59:47)
- 165 (2022-10-11 (火) 12:55:56)
- 166 (2023-01-02 (月) 03:21:26)
- 167 (2023-01-17 (火) 17:00:11)
- 168 (2023-02-19 (日) 20:11:58)
- 169 (2024-08-05 (月) 14:22:36)
- title: Swingネタ帳 keywords: [Java, Swing] description: Swing関連のメモ、バグIDリンク、ネタ帳 author: aterai pubdate: 2006-01-29 Swing関係の自分用のメモ、バグIDへのリンク、ネタ帳です。また、以前ここで頂いたコメントは、Comments/Swingに移動しました。
調整中のネタ帳
- CubeEffect
- Animatingcardlayout — Project Kenai
- (JavaScript) Animation.Cube - Rotating Cube Animation Effect
- http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36768&forum=12&7
- jogl-demos:
- プログラマメモ2: Image Processing 台形変形への道 - へたれなので。
- Open source Java projects: AnimatingCardLayout - JavaWorld
- animatingcardlayout: ホーム
- Swing/FileChooserWithOptionPane
- %JAVA_HOME%\demo\jfc\FileChooserDemo\src\FileChooserDemo.java
- %JAVA_HOME%\demo\jfc\SwingSet2\src\FileChooserDemo.java
- BufferedImage#getScaledInstance - 1
- File createTempFile
- File getTotalSpace, getFreeSpace, getUsableSpace
- File zip unzip example
- Font CID Cmap
- Font
Font#canDisplay(...)
ゲタ文字 - JButton background color
- JColorChooser pallet save load XMLEncoder
- JComboBox ClearComboBoxSelection
- JComboBox search highlight
- JComboBox tooltips right side
- JComobBox Multi selection ComboBoxDropdownListSelect
- JDesktopPane JInternalFrame Tab Loop
- JEditorPane HTMLDocument#getIterator
- JEditorPane HTML Image Lazy loading
- JFrame Window#isActive()
- JFrame translate Image
- JLabel String width Unicode
- JList ListCellRenderer html performance
- JMenuBar 全体スライドメニュー
- JMenuItem JPopupMenu JButton Drag
- JOptionPane KeyEventDispatcher
- JOptionPane scroll
- JPasswordField Formatter and password char
- JPopupMenu BlankIcon
- JProgressBar Bootstrap center string
- JRadioButton + JTextField
- JRootPane isMnemonicHidden
- JScrollBar BlockIncrement
- JScrollPane Map View sub view
- JScrollPane VetoableChangeListener
- JScrollPane 自動スクロール上下ストップ
- JScrollPane 縦パネルリスト drag and drop
- JSlider JToggleButton OnOffToggleButton slider
- JSpinner multiple line
- JSplitPane show hide tab
- JTabbedPane ScrollButton Layout
- JTabbedPane Tearaway tabs
- JTabbedPane VerifyInputWhenFocusTarget
- JTabbedPane center SingleClick
- JTabbedPane tab height animation
- JTable Calendar
- JTable Cells with rouded corners in JTable
- JTable GroupableTableHeader tame
- JTable VerticalTableHeader
- JTable cell Editable and auto completion JComboBox suggest in TableCell
- JTable git graph JLayer
- JTable multiple rows editor
- JTextArea two-column format
- JTextField Focus Animation
- JTextField(search) in JButton(Tab, ButtonBar)
- JTextPane Highlighter#removeAllHighlights()
- JTextPane Parallax
- JTextPane preview code HTML
- JToolBar target JLayer
- JToolBar transparent top
- JTooltip JWindow Focus Drag
- JTree JList(1.8.0) Nimbus Selection Rectangle
- JTree Table
- JTree TreeNodeMaxLevel TreePath#getPathCount DefaultMutableTreeNode#getLevel
- JTree under Node only sort
- Shape Line Animation
- UIDefaults ProxyLazyValue
Swing関係のバグのメモ
JToolBarに配置したJButtonのフォーカス描画
- java - Decorating a rollover toolbar button with JLayer paints its border - Stack Overflow
JButton
をJLayer
でラップしてJToolBar
に追加すると、JToolBar
用のフォーカス描画ではなく、デフォルトのフォーカス描画が適用されてしまう- 回答されているように、
BasicToolBarUI#setBorderToRollover(...)
などが、JLayer
を想定していない - JLayerで隣接する別コンポーネント上に縁を描画のように、親の
JToolBar
にJLayer
を設定し、e.getComponent()
でJButton
を取得して回避可能
NimbusLookAndFeelでのJComboBoxの推奨サイズ
- java - Swing (JComboBox) bug? printing dimension - Stack Overflow
JComboBox
の時点と、JFrame
に追加してJFrame#pack()
もしくはJFrame.setSize(...)
後で、JComboBox
の推奨サイズ(幅)が異なる?NimbusLookAndFeel
のみの現象?setEditable(true)
にすると高さが異なる...
JComboBox#getPreferredSize()
を呼ぶと項目の文字列長を検索して、cachedMinimumSize
にサイズがキャッシュされるArrowButton
の幅がデフォルト16
とJComboBox
用は19
と異なるSynthArrowButton#getPreferredSize(JComponent)
で、context.getStyle().getInt(context, "ArrowButton.size", 16);
が呼ばれている
import java.awt.*;
import javax.swing.*;
public class NimbusComboBoxSizeTest {
public JComponent makeUI() {
String[] model = {"Average"};
JPanel p0 = new JPanel();
JComboBox<String> combo0 = new JComboBox<>(model);
p0.add(combo0);
JPanel p1 = new JPanel();
JComboBox<String> combo1 = new JComboBox<>(model);
p1.add(combo1);
Box box = Box.createVerticalBox();
box.add(p0);
box.add(p1);
EventQueue.invokeLater(() -> System.out.println("combo0: " + combo0.getPreferredSize()));
System.out.println("combo1: " + combo1.getPreferredSize());
JPanel p = new JPanel(new BorderLayout());
p.add(box, BorderLayout.NORTH);
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> createAndShowGUI());
}
public static void createAndShowGUI() {
try {
for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(laf.getName())) {
UIManager.setLookAndFeel(laf.getClassName());
UIDefaults d = UIManager.getLookAndFeelDefaults();
System.out.println("ArrowButton.size: " + d.getInt("ArrowButton.size"));
System.out.println("ComboBox.arrowButton.size: " + d.getInt("ComboBox:\"ComboBox.arrowButton\".size"));
//どちらかのコメントを外して値を揃えてやると、以下の現象は修正される?
//d.put("ComboBox:\"ComboBox.arrowButton\".size", 16);
//d.put("ArrowButton.size", 19);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new NimbusComboBoxSizeTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
高解像度でJOptionPaneのアイコンが欠ける
- java - Bad Swing UI scaling on high resolution (MS Surface) - Stack Overflow
Surface Pro 3
でテキスト文字サイズを150%
に設定し、JOptionPane
をWindowsLookAndFeel
で表示すると、アイコンが欠けるバグ?- 以下のように
OptionPane.minimumSize
を設定しても解消しない - レイアウトでおかしくなっているのではなく、取得するアイコン自体が欠けている?
import java.awt.*;
import javax.swing.*;
public class OptionPaneResolutionTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
Dimension defaultSize = UIManager.getDimension("OptionPane.minimumSize");
System.out.println("OptionPane.minimumSize default: " + defaultSize);
int sr = Toolkit.getDefaultToolkit().getScreenResolution();
float dpi = System.getProperty("os.name").startsWith("Windows") ? 96f : 72f;
float sot = sr / dpi;
System.out.format("%d%%%n", (int)(sot * 100));
Dimension mind = new Dimension((int)(defaultSize.width * sot),
(int)(defaultSize.height * sot));
System.out.println("OptionPane.minimumSize: " + mind);
UIManager.put("OptionPane.minimumSize", mind);
JOptionPane.showMessageDialog(null, "msg", "Information", JOptionPane.INFORMATION_MESSAGE);
}
}
親フレームのドラッグ中にJWindowでクラッシュ
- Java Swing JWindow application crash - Stack Overflow
- 親フレームのドラッグ中に?子
JWindow
が表示されるとJVM
が落ちる(Windows 7 64bit JKD1.8.0_11
)。 - #JDK-8079595 Resizing dialog which is JWindow parent makes JVM crash - Java Bug System
- jdk9/client/jdk: b5125fa7ef4b 修正された模様
- 親フレームのドラッグ中に?子
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Main2 {
private static Robot robot;
public static void main(String... args) throws Exception {
robot = new Robot();
robot.setAutoDelay(100);
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
EventQueue.invokeAndWait(new Runnable() {
@Override public void run() {
Point pt = new Point(50, 10);
robot.mouseMove(pt.x, pt.y);
robot.mousePress(InputEvent.BUTTON1_MASK);
pt.translate(50, 50);
robot.mouseMove(pt.x, pt.y);
//robot.mouseRelease(InputEvent.BUTTON1_MASK);
}
});
}
public static void createAndShowGUI() {
final JFrame f = new JFrame();
f.add(new JLabel("Try JFrame draging 2sec"));
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setSize(320, 240);
f.setVisible(true);
final JWindow w = new JWindow(f);
w.add(new JButton("button"));
w.pack();
Timer t = new Timer(2000, new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
w.setVisible(true);
}
});
t.setRepeats(false);
t.start();
}
}
TimSortでレイアウトをソート中に例外発生
- java - swing gui flickering white error - Stack Overflowのサンプルを試していたら面白い挙動に遭遇。
JDK1.8.0_40
で(以前のソートを使用するように)修正された- Bug ID: JDK-8048887 SortingFocusTraversalPolicy throws IllegalArgumentException from the sort method
JDK1.7.0_21
- IllegalArgumentException: Comparison method violates its general contract!
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeLo(TimSort.java:747) at java.util.TimSort.mergeAt(TimSort.java:483) at java.util.TimSort.mergeCollapse(TimSort.java:410) at java.util.TimSort.sort(TimSort.java:214) at java.util.TimSort.sort(TimSort.java:173) at java.util.Arrays.sort(Arrays.java:659) at java.util.Collections.sort(Collections.java:217)
- フレームのリサイズで上下左右に余白?
- IllegalArgumentException: Comparison method violates its general contract!
JDK1.6.0_41
- フレームのリサイズで右と下に余白?
import java.awt.*;
import javax.swing.*;
public class Gui {
public JComponent makeUI() {
JPanel p = new JPanel(new GridLayout(22,12,10,10));
p.setBackground(Color.WHITE);
p.setBorder(BorderFactory.createLineBorder(Color.BLUE, 10));
for (int i = 0; i < 22; i++) {
for (int j = 0; j < 12; j++) {
JLabel label = new JLabel();
label.setBorder(BorderFactory.createLineBorder(Color.RED));
label.setBackground(Color.GRAY);
label.setOpaque(true);
//label.setPreferredSize(new Dimension(50, 50));
p.add(label);
}
}
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new Gui().makeUI());
f.setSize(320, 240);
//f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
テスト中のコードなど
JMenuBarの検索
JMenuBar
を検索してJRadioButtonMenuItem
に、ActionListener
を追加
Arrays.stream(menuBar.getSubElements())
.flatMap(new Function<MenuElement, Stream<MenuElement>> () {
@Override public Stream<MenuElement> apply(MenuElement me) {
MenuElement[] sub = me.getSubElements();
if (sub.length != 0) {
return Arrays.stream(sub).flatMap(sme -> apply(sme));
} else {
return Stream.of(me);
}
}
})
.filter(mi -> mi instanceof JRadioButtonMenuItem)
.forEach(mi -> ((JRadioButtonMenuItem) mi).addActionListener(al));
Swingのサンプルに関するメモ(引用)
目標にしようと思っているけど、なかなか難しそう…。
シンプルで、小さなサンプル(Simple Client Applications)
- java.net Forums : Simple Client Applications ...
- via: Editor's Daily Blog: All I Want
What surprises me about Java on the desktop is that there are very few simple clean example of it in use that are fundamental.
- via: Editor's Daily Blog: All I Want
「チュートリアル」「小さなサンプル」「レビュー」
- 社内ライブラリのチュートリアル
社内にはそのライブラリで作られたアプリケーションが色々あり, ライブラリを使う時はその中から欲しいコード片を掘り起こすのが常だった.苦労の多い作業だった. オブジェクトの初期化, 設定, 利用のシーケンスはコード内に分散しており, それを漏れなく抜き出すのは難しい. コードの質も玉石混合で, バグを持ったままコピペされることもあった. 私達の目的は, 極端に言えば便利で正しいコピペ素材を提供することだった.
Examples should be exemplary (例は典型的であるべき)
- Interested in Writing New Tutorial Demos for Sun?についてたコメントを引用
- 開発者はサンプルコードに頼って(コピペして)いる
- Examples should be exemplary
He references a research study that found that a bug in one of the original JDK applet examples was replicated in 75% of applets attempting similar goal in their sampling of applets found on the internet. This underscores the fact that developers rely on example code, even, unfortunately, to the point that we copy bugs too. This is sometimes described as "Monkey see, monkey do", or "Rape and Paste".
コピー指向プログラミング
- http://ameblo.jp/argv/entry-10144604985.html
- あらかじめ完成度の高い「コピー元」を用意する
- コピー元を品質の高いコードに集中させることで、「バグのコピー」や「似て非なるバージョンの散在」を防ぐ。
- 「コピーされたもの」が分かるようにする
- 例えば、コピー元のコードに特殊なコメントを埋め込む(もちろん、コピー先でも消さないでおく)などして、後からコピー先を検索しやすくする。これは、不具合修正や仕様変更などの際に、影響範囲(全てのコピー先)を特定しやすくするためである。
Best Practice for Swing coding
- Alexander Potochkin's Blog: Why I don't use Swing hacks (in production code)についてたコメントを引用
- For deities sake, coordinate your documentation and example in one single place. And make sure they demonstrate best practice.
- 米Microsoft、コードサンプル集「All-In-One Code Framework」 - SourceForge.JP Magazine
http://weblogs.java.net/blog/alexfromsun/archive/2007/09/why_i_dont_like.html:title=Best Practice for Swing coding> The problem with the "Swing Hacks" book is that it contains solutions in search for problems. And that is just the wrong motivation to add a hack to production code. There are other, good motivations to add hacks to production code. Let's start with a better definition of the word hack: A creative circumvention of a limitation And unfortunately Swing has many limitations which hurt in the real world. If your customer insists that you make something happen "or else ..." you have a very good motivation for a hack. I do not agree that a programmer has to understand all implications of a hack. Swing is such a complex system, itself full of ugly hacks, bugs, and badly documented, that this is just not feasible. When it comes to Swing then part of the problem is not only that Swing is so limited, but also that the limitations don't get fixed. This is an attitude problem at Sun. Sun lacks the understanding and imagination of what is needed on the desktop. Many Sun people still seem to live in SunView (ups, I am showing my age here) lala-land. Sun thinks it's always right. Sun has totally failed to establish a best-practice for Swing coding. The examples that ship with the JDK are some of the worst Swing code. What is even worse, while Sun employees were busy writing shiny conference demos, no one at Sun could be arsed to clean up the JDK example mess during the last ten years. This is not an isolated case. The Swing tutorial examples are equally bad. They can't even be bothered to use JavaDoc for documentation and typically demonstrate badly structured code for badly structured GUIs. Sun also has fragmented and hidden GUI information in unbelievable ways. For example, try to find a single page listing all Swing system properties. Good luck. In general, some Swing information comes with the JDK. Some can be found in the TSC (which is on life support). Others on ominous pages like JDCTechTips, Almanac (blech!), Code samples, Online Training article, Java.net articles, multi-media samples, technical articles, 2D examples in four places (did you know Sun has a half-finished Postscript Interpreter in Java http://java.sun.com/products/java-media/2D/samples/postscript/PostscriptDemo.zip?). Then there are dev.java.net examples, JDC, SDN, whatnot. I have probably forgot another ten places where Sun hides Swing, 2D, media, GUI or desktop information. No one at Sun seems to coordinate the stuff. Instead everyone at Sun seems to run the his own show, trying to establish an own kingdom. For deities sake, coordinate your documentation and example in one single place. And make sure they demonstrate best practice. Posted by: ewin on September 28, 2007 at 02:58 PM
Swing 修正予定・検討メモ
実際にやるかどうかは未定ですが、今後Swing Tips
を改良したいと思っていることをメモしています(順不同)。
Swing Tips
のみ分離して、Markdown
、静的サイト生成に移行できないか検討中- http://ateraimemo.com/index.html で、
Jekyll Bootstrap
、DISQUS
のテスト中 Jekyll
、タグ付けinline
の<code>
タグJDK 1.6.0_10
などのアンダーラインnew JPanel()
などの翻訳拒否<code>
で翻訳されないはず
- http://ateraimemo.com/index.html で、
- https://sites.google.com/site/javaswingtips/ は、
500
ページ近く手動でアップロードすることになりそうなので無理かも
- ソースコード
Wiki
中のサンプルコードでクラスなどをjavadoc
に自動リンク- 日本語、文字コード
修正済みgist
プラグインでの行番号がズレてしまう
- 簡単にコンパイル、実行
- Ant(build.xml)、バッチファイル、シェルスクリプトの改良
- build.xml の整理
- NetBeans (Eclipse) .classpath、.projectの追加
- src.zipのファイル名を、それぞれ適当なものに変更?
- Ant(build.xml)、バッチファイル、シェルスクリプトの改良
- 各Tipsの難易度表示
- こちらで適当に評価するか、ユーザに評価してもらうか…
- レーティングバー
- Web Start
- 「プログラムの追加と削除」に登録されない方法を探す
- キャッシュを無効にする
- UI操作無しで全部削除できる方法を探す
- javaws -uninstall
- 起動時にスプラッシュスクリーンを表示しない方法を探す
- javaws -Xnosplash <jnlp>
- 「プログラムの追加と削除」に登録されない方法を探す
- バージョンの表記
- Javaの新バージョンはJDK1.9ではない
- JDK 6 と JDK 1.6 どちらかに揃える
- Java 7 と Java 1.7.0 どちらかに揃える
変更済み
- ライセンス
google code においたソースコードは、MIT License- What license should I use for code snippets released on my blog? - Stack Overflow
- http://hobbylinux.info/download/rtl8181/src/GPL/wireless_tools.25-broken!!!/sample_pm.c
- This particular snipset of code is available under the Apache license, BSD license, CC0, ..., WTFPL (at your choice).
- スクリーンショット
screenshot一覧ページの分割- スクリーンショットはすべて Picasa に移動
- 一覧は https://picasaweb.google.com/112210866074949770793/JavaSwingTips02?authuser=0&feat=directlink
- スパム対策
英数のみのコメント禁止別の対策を導入再度英数のみのコメント禁止
ソースコード、FindBugs, PMDリポジトリ(Subversion)を公開(JavaForge、sourceforge.jpとか調べる)- http://code.google.com/p/java-swing-tips/source/checkout
もしくは全ソースコードの一括ダウンロードを簡単に(wgetなどの対策)Mercurial にするかも
ソースコード、Ubuntuなどでも実行できるようにe.isPopupTrigger()を使ってJPopupMenuを表示している箇所(JDK 5 以前のソース)を、すべてsetComponentPopupMenuに変更する。
ソースコード、1.5以上対応に変更Color クラスにおける定数の大文字化ソースコード、codeプラグインで色分けソースコード、build.xmlなどをすべてUTF-8化バッチファイルの代わりにantのタスクを使うように変更- antのbuild.xmlにrunタスクを追加、ただしバッチファイルも残すことに
sampleをexampleに統一Swing/JarFile?をAntの下に移動する分類: JTree JButtonTableSorter.javaをJDK6のTableRwoSorterに置き換えるソートする意味のないサンプルで使用しているTableSorter.javaは削除
スクリーンショットすべて撮り直す(prefixのコロン:)screenshot一覧ページの分割、画像サイズ削減キャッシュ一覧で探しやすいように、タイトルの頭に「サ:」(サンプル)を付けていたのを、「JST 」(Java Swing Tips)に変更日本標準時ではない…
分類JTableのTipsを分割- ソースを一つにまとめる(ワンクリックで全ソースコードを表示したい)ためにTestModel.javaを検索してpackageプライベートなクラスに変更中
>find . -type f -name TestModel.java -ls | gawk "{print $7, $11}" | sort
- Look&Feel関係でpublic クラスでないとダメなのは…、放置。
リンクメモ(自分用)
- #JDK-8039464 The scrollbar in JScrollPane has no right border if used WindowsLookAndFeel - Java Bug System
- Core Java Technologies Tech Tips
- Styling Digital Images with ConvolveOp and Using HttpURLConnection to Access Web Pages Tech Tips
- Online Training and Tutorials
- Java Technology Fundamentals Newsletter
- Chapter 6 Continued: Advanced Printing
- Short Course
- Learning Java 2D, Part 1
- Creating Wizard Dialogs with Java Swing
- Using JConsole to Monitor Applications
- VolatileBufferedToolkitImage Strategies
- Intermediate Images
- Java 2D: New Printing Package
- Deploying Software with JNLP and Java Web Start
- Java look and feel Graphics Repository
- Java 2D API Sample Programs
Bugリンクメモ(自分用)
- Bug ID: 6723524 Invalid background of components displayed in JTable in Nimbus L&F
- Release Fixed: 1.7.0
Bug ID: 6910490 MatteBorder JScrollpane interaction - Bug ID: 6612928 Win32ShellFolder2 throws RejectedExecutionException on application exit
- Bug ID: 4280944 Attributes on last newline character cause undesirable extra spacing.
- Bug ID: 6780505 java.awt.Desktop.getDesktop().open() fails on shared files with white spaces
- Bug ID: 4777210 setText causes deadlock in JFormattedTextField, JTextComponent
- Bug ID: 6937538 Nimbus: JInternalFrame() causes exception if user UI installed
- Release Fixed: 1.4.0
Bug ID: 4463424 LineBreakMeasurer inconsistent with TextLayout - Bug ID: 6700748 Cursor flickering during D&D when using CellRendererPane with validation
- Bug ID: 6723524 Invalid background of components displayed in JTable in Nimbus L&F
- Bug ID: 4292511 JTableHeader height determined by first column given HTML text
- Bug ID: 6826514 SwingWorker: done() called before doInBackground() returns, when cancelled
- Bug ID: 6413228 Many links broken with "?is-external=true".
- Bug ID: 4908277 Animated GIF does not play inside JTable, customized TableCellRenderer
- Release Fixed: 1.7.0, 1.6.0_18
Bug ID: 4833524 BasicTreeUI.isToggleSelectionEvent() does not properly handle popup triggers - Release Fixed: 1.7.0, 1.6.0_18
Bug ID: 6840086 JFileChooser lacks icons on top right when running on Windows 7 - Bug ID: 4765261 JTextArea.append does not follow spec (it is not ThreadSafe)
- Bug ID: 4760477 JTextArea.append(String) is not ThreadSafe
- Release Fixed: 1.7.0
Bug ID: 4765383 JTextArea.append(String) not thread safe - Bug ID: 7140863 Lots of Japanese OpenType fonts do not render correctly
- Bug ID: JDK-5036549 PopupMenu not adjusting its location correctly depending on taskbar's position.
メモ: 痒いところに手が届かないJavaのコード
初期化時にデッドロックの可能性があるからということで、それはいいとして。 代わりに使うのが Logger.getLogger(Logger.GLOBAL_LOGGER_NAME) だなんて、どうにかしてほしい。 Logger.getGlobal() を用意してくれればいいのに。なに考えてんだろう?EoDじゃなかったの? Javaのコード書きにくさって、静的動的よりも、こういう痒いところに手が届かないことの積み重ねが大きいと思う。
Swing関係
- 表の全行を削除するメソッド
- 表の全行を削除する場合、
DefaultTableModel#setRowCount(0);
ではなく、もっと分かりやすいメソッドが欲しい。 - 例えば
DefaultComboBoxModel#removeAllElements()
、DefaultListModel#clear()
のような(これはこれでどれかひとつに統一して欲しい…)。
- 表の全行を削除する場合、
- フレームを画面中央に表示するメソッド
- フレームを画面中央に表示する場合、
Window#setLocationRelativeTo(null);
ではなく、もっと分かりやすいメソッドが欲しい。 JavaFX Script
では、centerOnScreen: true
が用意されていたが…。
- フレームを画面中央に表示する場合、