teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2015/02/11 13:03

投稿

argius
argius

スコア9396

answer CHANGED
@@ -19,3 +19,57 @@
19
19
  });
20
20
  }
21
21
  ```
22
+ ---
23
+
24
+ (追記)
25
+
26
+ Windows 7では発生しないので、LinuxもしくはUbuntu固有の問題なのかもしれませんね。
27
+ ちなみにWindows 7では、100x30(width:100,height:30)にした場合、ウィンドウのサイズは142x48になっています。
28
+
29
+
30
+ 直接原因は分かりませんが、いくつか修正したほうが良いと思う箇所はあります。
31
+ 良かったら参考にしてみてください。
32
+ ・ウィンドウサイズは(やはり)`setSize`を使う
33
+ ・`BorderLayout`ではコンポーネントのサイズは指定できない
34
+ ・`BorderLayout`に追加するときは、`add(component, BorderLayout.CENTER)`などを使う
35
+ ・`validate`を使ってみる
36
+
37
+ ```lang-java
38
+ import java.awt.BorderLayout;
39
+ import javax.swing.JButton;
40
+ import javax.swing.JFrame;
41
+
42
+ public class Test extends JFrame {
43
+ JButton b;
44
+ public Test() {
45
+ //JFrame
46
+ setTitle("Test");
47
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
48
+ // setBounds(0, 0, 100, 30);
49
+ setSize(100, 30);
50
+ setResizable(false);
51
+
52
+ //JButton
53
+ b = new JButton();
54
+ b.setText("hello!");
55
+ // b.setVisible(true);
56
+ // b.setSize(100, 30);
57
+
58
+ // add(b);
59
+ add(b, BorderLayout.CENTER);
60
+ validate();
61
+ setVisible(true);
62
+ }
63
+
64
+ public static void main(String[] args) {
65
+ SwingUtilities.invokeLater(new Runnable() {
66
+ @Override
67
+ public void run() {
68
+ @SuppressWarnings("unused")
69
+ Test my = new Test();
70
+ }
71
+ });
72
+ }
73
+
74
+ }
75
+ ```

1

本回答

2015/02/11 13:03

投稿

argius
argius

スコア9396

answer CHANGED
@@ -1,1 +1,21 @@
1
- おそらく`new Test()`している処理が`main`メソッドにあると思いますが、そこも記載していただけますでしょうか。
1
+ おそらく`new Test()`している処理が`main`メソッドにあると思いますが、そこも記載していただけますでしょうか。
2
+
3
+ ---
4
+
5
+
6
+ `AWT`や`Swing`などのGUIを使用する場合は、描画処理を**イベントディスパッチスレッド**(AWTスレッド)で実行されるようにしないと、描画が正しく行われない可能性があります。
7
+ イベントディスパッチスレッドで実行するには、Swingの場合は`SwingUtilities.invokeLater(Runnable)`を使います。
8
+
9
+ 例:
10
+ ```lang-java
11
+ // import javax.swing.SwingUtilities;
12
+
13
+ public static void main(String[] args) {
14
+ SwingUtilities.invokeLater(new Runnable() {
15
+ @Override
16
+ public void run() {
17
+ Test my = new Test();
18
+ }
19
+ });
20
+ }
21
+ ```