2016-12-20 30 views
0

ボタンをクリックした後、JPanelがJFrameに表示されないのはなぜですか? コードがあります:JPanelがJFrameに表示されない

import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JList; 

import javax.swing.DefaultListModel; 
import javax.swing.AbstractListModel; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.JButton; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JPanel; 

public class Main { 

    private JFrame frame; 
    private JTable table; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Main window = new Main(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public Main() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setResizable(false); 
     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     table = new JTable(); 
     table.setModel(new DefaultTableModel(
      new Object[][] { 
       {"1", "Marcin Zelek", "537573656"}, 
       {"2", "Krzysztof Tomala", "324159103"}, 
       {"3", "Zbigniew S", "324159104"}, 
      }, 
      new String[] { 
       "#", "Name", "Phone number" 
      } 
     )); 
     table.getColumnModel().getColumn(1).setPreferredWidth(214); 
     table.getColumnModel().getColumn(2).setPreferredWidth(246); 
     table.setBounds(12, 103, 426, 185); 
     frame.getContentPane().add(table); 

     JButton btnDodajNowy = new JButton("Dodaj nowy"); 
     btnDodajNowy.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseReleased(MouseEvent arg0) { 
       JPanel panel = new JPanel(null);// Creating the JPanel 
       panel.setBounds(0, 243, 286, 150); 
       panel.setVisible(true); 

       JButton button = new JButton("New button"); 
       button.setBounds(12, 12, 117, 25); 
       panel.add(button); 

       frame.getContentPane().add(panel); 
      } 
     }); 
     btnDodajNowy.setBounds(12, 30, 117, 25); 
     frame.getContentPane().add(btnDodajNowy); 

     JButton btnUsuZaznaczone = new JButton("Usuń zaznaczone"); 
     btnUsuZaznaczone.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseReleased(MouseEvent arg0) { 
       DefaultTableModel model = (DefaultTableModel) table.getModel(); 
       int[] selection = table.getSelectedRows(); 
       for (int i = 0; i < selection.length; i++) 
       { 
        model.removeRow(selection[i]-i); 
       } 
      } 
     }); 
     btnUsuZaznaczone.setBounds(141, 30, 204, 25); 
     frame.getContentPane().add(btnUsuZaznaczone); 

    } 
} 

ありがとうございました。

+2

ある'最も簡単なのような初心者スイングするように見えるかもしれませんし、複雑なGUIを作成する最良の方法は、より多くのスイングGUIを使用するときに実行するより深刻な困難を作成します。 GUIのサイズが変更されたときにコンポーネントのサイズを変更することはありません。これらのコンポーネントは、拡張または維持するロイヤルウィジェットであり、スクロールペインに配置すると完全に失敗し、元のプラットフォームとは異なるすべてのプラットフォームまたは画面解像度で表示されます。 –

+1

レイアウトマネージャを意図どおりに使用した場合、この問題は発生しません。さらに助けが必要な場合は、意図した動作を説明するなど、さらに質問を明確にしてください。 –

答えて

0

あなたが代わりにActionListenerを使用する必要があります。

btnDodajNowy.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JPanel panel = new JPanel();// Creating the JPanel 
     panel.setBounds(0, 243, 286, 150); 
     JButton button = new JButton("New button"); 
     button.setBounds(12, 12, 117, 25); 
     panel.add(button); 
     frame.getContentPane().add(panel); 
     frame.repaint(); 
    } 
}); 

とも:

  1. を追加したいかもしれませんJPanelコンストラクタ
  2. にパラメータとしてnullを渡す必要はありませんframe.repaint()
  3. JPanelをで表示する必要はありません。
0

しかし、これは追加されていますが、それはJTableの下に隠れています。最速の修正は、このされています

this.generalPanel = new JPanel(); 
frame.getContentPane().add(generalPanel); 
... 
generalPanel.add(table); 

あなたは最上位のコンテナのための良いレイアウトを取得します。この方法は:しかし、私はそれを少し書き換えることをお勧め

public void mouseReleased(MouseEvent arg0) { 
    //... 
    panel.setBounds(0, 300, 286, 150); // 300 is on the y axis 
    //... 
    // then render the frame again: 
    frame.revalidate(); 
    frame.repaint(); 
} 

+0

300とframe.revalidate()を設定した後も、まだパネルは表示されません。 –

+0

はい。 'revalidate'と' repaint'も必要です。 –

+0

また、デバッグのためにこれを試すこともできます: 'panel.setBorder(new LineBorder(Color.red));' –

関連する問題