-
title: 来週のネタとか(゚ε゚)
noindex: true
nofollow: true
#pubdate: 2006-01-29
title: Swingネタ帳
keywords: [Java, Swing]
description: Swing関連のメモ、いつか取り上げる予定にしているネタのメモなど
author: aterai
pubdate: 2006-01-29
Swing関係の自分用のメモ、ネタ帳です。また、以前ここで頂いたコメントは、Comments/Swingに移動しました。
概要
Swing関係の自分用のメモとかネタ帳みたいなものです。
google八分メモ
- 状況
-
2014/08
中頃からハブられている模様
-
2014/09
中頃、何日か復活してたけど、また駄目になる
- ウェブマスターツールには特にメッセージ無し
- 対策(効果なし?)
- 新着RSS用に更新してた「はてな」を非公開
- 一覧やタグページを
<meta name="robots" content="NOINDEX,FOLLOW" />
に
-
sitemap
を分割
- コメントをDISQUSに移行
- コメントユーザーページへの
404
ページを作成しない
-
schema.org
でマークアップ
-
xrea.jp
自体がペナルティを受けていると考えたほうが良さそう
- 他のサイト(
*.xrea.jp
)でも、同じ症状(タイトルで検索しても上位に表示されない)が確認できる?
調整中のネタ帳
JComponent
- JColorChooser pallet save load XMLEncoder
- JComboBox tooltips right side
- JEditorPane HTML Image Lazy loading
- JList ListCellRenderer html performance
- JMenuBar Slide in/out animation
- JMenuItem JPopupMenu JButton Drag
- JOptionPane KeyEventDispatcher
- JOptionPane scroll
- JPasswordField Focus Blur effect transparent
- JPasswordField Formatter and password last char
- JProgressBar Bootstrap center string
- JPopupMenu scroll JScrollPane
- JRadioButton + JTextField
- JScrollBar BlockIncrement
- JScrollPane VetoableChangeListener
- JSlider Sound MIDI seekbar
- JSlider status Range restriction
- JSpinner multiple line
- JSplitPane show hide tab
- JTabbedPane ScrollButton Layout
- JTabbedPane Tearaway tabs
- JTabbedPane content Rounded corners like nimbus
- JTabbedPane tab height animation
- 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 Parallax
- JToolBar target JLayer
- JToolBar transparent top
- JToolTip speech Balloon tooltip left center right
- JToolTip JWindow Focus Drag
- JTree JList(1.8.0) Nimbus Selection Rectangle
- JTree Table
- JTree under Node only sort
- JTree AbstractLayoutCache.NodeDimensions FixedHeightLayoutCache
その他
- File createTempFile
- File getTotalSpace, getFreeSpace, getUsableSpace
- Font CID Cmap
- LocalDate DateFormatter sample
- MetalTheme Arrow Color
- UIDefaults ProxyLazyValue
- Image
BufferedImage#getScaledInstance() - 1
さくらレンタルサーバ(+独自ドメイン)に移行(2014/11/01)
Java 9 AWT, Swing 新機能
- 2014/11末現在、アクセス数などは以前の水準に戻っている
DefaultLookup
移動: ネタのリクエスト、Swingのサンプルに関するメモ
Java 9
Swing調整中のネタ一覧
調整中
以下テスト中なので、Exception
が発生したり、まともに動作しなくても(゚ε゚)キニシナイ!!
- Swing/CubeEffect?
- Swing/DefaultLookAndFeelDecorated?
- Swing/ScrollPaneCorner?
- Swing/ElementAttribute
ElementAttribute\src\java\example\MainPanel.java:137: warning: [deprecation]
viewToModel(JTextComponent,Point,Bias[]) in TextUI has been deprecated
int pos = editor.getUI().viewToModel(editor, e.getPoint(), bias);
^
- Swing/GetLineText
C:\Users\terai\jst\GetLineText\src\java\example\MainPanel.java:170: warning: [deprecation] viewToModel(Point)
in JTextComponent has been deprecated
int pos = textArea.viewToModel(new Point(0, y));
^
検討中で未実装
こっそり消えても(゚ε゚)キニシナイ!!
メモ
Swing関係のバグのメモ
高解像度でJOptionPaneのアイコンが欠ける
#spanend
#spandel
import java.awt.*;
#spanend
#spandel
import javax.swing.*;
#spanend
- [[Swing/PasswordView]]
PasswordView\src\java\example\MainPanel.java:75: warning: [deprecation]
drawEchoCharacter(Graphics,int,int,char) in PasswordView has been deprecated
@Override protected int drawEchoCharacter(Graphics g, int x, int y, char c) {
^
#spandel
public class OptionPaneResolutionTest {
#spanend
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);
#spanadd
* 投稿日メモ [#t2d1fa26]
#spanend
- 投稿時間が不明な記事一覧
-- buckupやアクセスログから調査可能な記事は、スクリプトや手動で復元したが、以下はwikihomeから移転した日時しか残っていない
JOptionPane.showMessageDialog(null, "msg", "Information", JOptionPane.INFORMATION_MESSAGE);
}
#spandel
}
#spanend
#spandel
Swing/DeviceName | 5377696E672F4465766963654E616D65 | 2003-09-08 |
Swing/GridBagLayout | 5377696E672F477269644261674C61796F7574 | 2003-09-15 |
Swing/MinimumFrame | 5377696E672F4D696E696D756D4672616D65 | 2003-09-22 |
Swing/Preferences | 5377696E672F507265666572656E636573 | 2003-09-29 |
Swing/ResourceMenuBar | 5377696E672F5265736F757263654D656E75426172 | 2003-10-06 |
Swing/SystemColor | 5377696E672F53797374656D436F6C6F72 | 2003-10-20 |
Swing/FontChange | 5377696E672F466F6E744368616E6765 | 2003-10-27 |
Swing/FileHistory | 5377696E672F46696C65486973746F7279 | 2003-11-10 |
Swing/FileFilter | 5377696E672F46696C6546696C746572 | 2003-11-17 |
Swing/LookAndFeel | 5377696E672F4C6F6F6B416E644665656C | 2003-11-24 |
Swing/ScrollIncrement | 5377696E672F5363726F6C6C496E6372656D656E74 | 2003-12-01 |
Swing/RecursiveFileSearch | 5377696E672F52656375727369766546696C65536561726368 | 2003-12-15 |
Swing/TabbedPane | 5377696E672F54616262656450616E65 | 2003-12-22 |
Swing/SortableTable | 5377696E672F536F727461626C655461626C65 | 2004-01-05 |
Swing/StyleConstants | 5377696E672F5374796C65436F6E7374616E7473 | 2004-01-12 |
Swing/StripeTable | 5377696E672F5374726970655461626C65 | 2004-01-19 |
Swing/EventListener | 5377696E672F4576656E744C697374656E6572 | 2004-01-26 |
Swing/FixedWidthColumn | 5377696E672F46697865645769647468436F6C756D6E | 2004-02-02 |
Swing/ColorTab | 5377696E672F436F6C6F72546162 | 2004-02-09 |
Swing/DnDList | 5377696E672F446E444C697374 | 2004-02-16 |
Swing/MoveRow | 5377696E672F4D6F7665526F77 | 2004-02-23 |
親フレームのドラッグ中にJWindowでクラッシュ
Swing関係のバグのメモ
テスト中のコードなど
TreeNodeを再帰的に検索してStreamを生成
import java.awt.*;
import java.awt.event.*;
#spanadd
import java.util.Collections;
#spanend
#spanadd
import java.util.Enumeration;
#spanend
#spanadd
import java.util.stream.Stream;
#spanend
import javax.swing.*;
#spanadd
import javax.swing.tree.*;
#spanend
#spandel
public class Main2 {
#spanend
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();
}
#spandel
}
#spanend
#spandel
public class TreeNodeStreamTest {
public JComponent makeUI() {
JTree tree = new JTree();
TreeNode root = (TreeNode) tree.getModel().getRoot();
TimSortでレイアウトをソート中に例外発生
#spanend
#spandel
import java.awt.*;
#spanend
#spandel
import javax.swing.*;
#spanend
System.out.println("-- concat flatMap --");
stream2(root).forEach(System.out::println);
#spandel
public class Gui {
#spanend
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);
}
}
System.out.println("-- map reduce --");
stream3(root).forEach(System.out::println);
#spanadd
#spanend
System.out.println("-- preorderEnumeration --");
Enumeration<?> e = ((DefaultMutableTreeNode) root).preorderEnumeration();
Collections.list(e).stream()
.filter(TreeNode.class::isInstance).map(TreeNode.class::cast)
.forEach(System.out::println);
#spanadd
#spanend
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(tree));
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
#spanadd
#spanend
public static Stream<TreeNode> children(TreeNode node) {
return Collections.list((Enumeration<?>) node.children()).stream()
.filter(TreeNode.class::isInstance).map(TreeNode.class::cast);
}
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);
#spanadd
#spanend
public static Stream<TreeNode> stream1(TreeNode p) {
return children(p).flatMap(c -> Stream.concat(Stream.of(c), stream1(c)));
}
#spandel
}
#spanend
#spandel
public static Stream<TreeNode> stream2(TreeNode p) {
return Stream.concat(Stream.of(p), children(p).flatMap(TreeNodeStreamTest::stream2));
}
テスト中のコードなど
JMenuBarの検索
#spanend
#spandel
Arrays.stream(menuBar.getSubElements())
#spanend
.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));
public static void main(String... args) {
EventQueue.invokeLater(() -> {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new TreeNodeStreamTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
#spanadd
}
#spanend
Swingのサンプルに関するメモ(引用)
目標にしようと思っているけど、なかなか難しそう…。
シンプルで、小さなサンプル(Simple Client Applications)
「チュートリアル」「小さなサンプル」「レビュー」
- 社内ライブラリのチュートリアル
社内にはそのライブラリで作られたアプリケーションが色々あり, ライブラリを使う時はその中から欲しいコード片を掘り起こすのが常だった.苦労の多い作業だった. オブジェクトの初期化, 設定, 利用のシーケンスはコード内に分散しており, それを漏れなく抜き出すのは難しい. コードの質も玉石混合で, バグを持ったままコピペされることもあった. 私達の目的は, 極端に言えば便利で正しいコピペ素材を提供することだった.
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
を改良したいと思っていることをメモしています(順不同)。
- ソースコード
Wiki
中のサンプルコードでクラスなどをjavadoc
に自動リンク
- 日本語、文字コード
gist
プラグインでの行番号がズレてしまう 修正済み
- 簡単にコンパイル、実行
- Ant(build.xml)、バッチファイル、シェルスクリプトの改良
- NetBeans (Eclipse) .classpath、.projectの追加
- src.zipのファイル名を、それぞれ適当なものに変更?
- 各Tipsの難易度表示
- こちらで適当に評価するか、ユーザに評価してもらうか…
- レーティングバー
- Web Start
- 「プログラムの追加と削除」に登録されない方法を探す
- UI操作無しで全部削除できる方法を探す
- 起動時にスプラッシュスクリーンを表示しない方法を探す
変更済み
- スパム対策
英数のみのコメント禁止 別の対策を導入 再度英数のみのコメント禁止
ソースコード、FindBugs, PMD
ソースコード、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 JButton
TableSorter.javaをJDK6のTableRwoSorterに置き換える
ソートする意味のないサンプルで使用しているTableSorter.javaは削除
スクリーンショット
すべて撮り直す(prefixのコロン:)
screenshot一覧ページの分割、画像サイズ削減
キャッシュ一覧で探しやすいように、タイトルの頭に「サ:」(サンプル)を付けていたのを、「JST 」(Java Swing Tips)に変更
日本標準時ではない…
分類
リンクメモ(自分用)
Bugリンクメモ(自分用)
Bugリンクメモ
メモ: 痒いところに手が届かないJavaのコード
初期化時にデッドロックの可能性があるからということで、それはいいとして。
代わりに使うのが
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)
だなんて、どうにかしてほしい。
Logger.getGlobal()
を用意してくれればいいのに。なに考えてんだろう?EoDじゃなかったの?
Javaのコード書きにくさって、静的動的よりも、こういう痒いところに手が届かないことの積み重ねが大きいと思う。
- 表の全行を削除するメソッド
- 表の全行を削除する場合、
DefaultTableModel#setRowCount(0);
ではなく、もっと分かりやすいメソッドが欲しい。
- 例えば
DefaultComboBoxModel#removeAllElements()
、DefaultListModel#clear()
のような(これはこれでどれかひとつに統一して欲しい…)。
- フレームを画面中央に表示するメソッド
- フレームを画面中央に表示する場合、
Window#setLocationRelativeTo(null);
ではなく、もっと分かりやすいメソッドが欲しい。
-
JavaFX Script
では、centerOnScreen: true
が用意されていたが…。