2017-08-29 3 views
-1

私はJFrameといくつかのボタンとテキストフィールドを内部に持っています。私は絶対配置(ヌルレイアウト)を使用しています。私は描画するキャンバスを作成しようとしましたが、キャンバスをコンテナに追加してからフレームに追加しようとすると、キャンバスはすべてのボタンを上書きします。私は両方のボタンが表示されているキャンバスを持っていたい。ボタンとキャンバスをjframeに挿入する方法は? (Java swing)

これは私のコードです:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Gui extends JFrame { 
    private JLabel labEnterWord; 
    private JTextField tfWord; 
    private JButton butOk; 

    public Gui(String title) { 
     super(title); 
     JPanel p = new JPanel(); 
     p.setLayout(null); 

     //Create components and add them to the container 
     addComponents(p); 

     //Add containers to window 
     getContentPane().add(p); 
     getContentPane().add(new MyCanvas()); 

     setWindowProperties(); 
    } 

    private void addComponents(JPanel p) { 
     labEnterWord = new JLabel("Enter your word:"); 
     labEnterWord.setBounds(100, 60, 200, 30);     
     labEnterWord.setFont(new Font("Arial", Font.PLAIN, 20)); 
     p.add(labEnterWord); 

     tfWord = new JTextField(); 
     tfWord.setBounds(100, 100, 100, 25); 
     tfWord.setFont(new Font("Arial", Font.PLAIN, 14)); 
     p.add(tfWord); 

     butOk = new JButton("OK"); 
     butOk.setBounds(220, 100, 51, 25); 
     butOk.addActionListener(new Event()); 
     p.add(butOk); 
    } 

    private void setWindowProperties(){ 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
     setSize(1280, 720); 
     setResizable(false); 
     setLocationRelativeTo(null); 
    } 
} 

MyCanvasクラス:

import javax.swing.*; 
import java.awt.*; 

public class MyCanvas extends JPanel { 

    public void drawing(){ 
     repaint(); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.drawRect(500, 200, 200, 200); 
    } 
} 

メインクラスは、単にGUIを()を呼び出します。ここで

+1

ヒント:絶対配置を使用するのは魅力的ですが、そうではありません。むしろ、レイアウトマネージャーについて学ぶ初期の痛みを許してください。しかし、私を信じてください:固定サイズのフレームは、最後の千年です;-) – GhostCat

+0

[境界線](https://docs.oracle.com/javase/tutorial/uiswing/components/border.html)を使用してください! –

+0

Java GUIは、異なるロケールの異なるPLAFを使用して、異なるOS、画面サイズ、画面解像度などで動作する必要があります。したがって、ピクセルの完全なレイアウトには役立ちません。代わりに、レイアウトマネージャや[それらの組み合わせ](http://stackoverflow.com/a/5630271/418556)と[空白](http://stackoverflow.com/a/17874718/)のレイアウトパディングとボーダーを使用してください。 418556)。 –

答えて

1

getContentPane().add(p); 
getContentPane().add(new MyCanvas()); 

最初の1は、フレームにあなたのボタンを使ってパネルを追加します。次に、フレームに別のものを追加してください!

手動ですべてを配置する方法に従うと、パネルにそのキャンバスを追加してください!

JFrameを許可する手段をすべて無効にしました。パネルとキャンバスを意味のある場所に配置するレイアウトマネージャー。代わりにの2つの要素をフレームに挿入して、そのフレームにはのキャンバスがどこに行かなければならないのでしょうか?

キャンバスにも絶対配置が必要です。そうしないと、戻ってレイアウトマネージャに向かい、それを行うことができます。

+0

私は追加しようとしました p.add(新しいMyCanvas()); をaddComponents()メソッドに追加して削除しました。 getContentPane()。add(new MyCanvas()); でも動作しないようです。キャンバスはまったく表示されません。 – Peacetoletov

+0

また、キャンバスオブジェクトで 'setBounds'を使う必要があります。 – ArcticLord

+0

@Peacetoletov再び:要素の合理的な配置を無効にしたフレームに複数のコンポーネントを追加すると、どのようなことが起こりますか? – GhostCat

関連する問題