2016-06-24 9 views
0

JavaでSwingを使用してGUIを作成しようとしています。動的に要素をJScrollPanelに追加する方法

「追加」ボタンを押すと、JPanelが作成され、GUIの幅がいっぱいになります。 JPanelの内部には、特定の詳細(名前、ユーザーIDなど)を示すFlowLayoutを使用してJLabelが配置されます。その後Addボタンを押すたびに、直前に新しいJPanelを追加して、JScrollPaneが必要に応じて垂直スクロールバーをアクティブにするようにします。基本的には、JScrollPaneがその中に新しいJPanelを動的に追加できるようにします。

しかし、私はこれをしようとするいくつかの問題がありました。 JScrollPane内のパネルに使用するLayoutManagerを特定できません。私はGridlLayoutを使用しようとしましたが、JScrollPane全体を隠蔽するのに十分なJPanelがある場合、GridLayoutは新しいJPanelで以前のJPanelの下に追加するのではなく、新しい列を作成します。これを達成するために私は何をすべきですか?ここに私が持っているもののいくつかのイメージと、私が何をしたいのかの例があります。ここで

GUI

私は起こるしたいものです。

GUI Example

任意の助けをいただければ幸いです、事前にあなたに感謝! :)

EDIT:私はGridLayoutで試したコードの例です。

public Window() { 


    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 701, 400); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 
    setContentPane(contentPane); 

    JPanel buttonPanel = new JPanel(); 
    contentPane.add(buttonPanel, BorderLayout.SOUTH); 

    JButton btnAdd = new JButton("Add"); 
    buttonPanel.add(btnAdd); 

    JScrollPane scrollPane = new JScrollPane(); 
    contentPane.add(scrollPane, BorderLayout.CENTER); 

    JPanel systemsPanel = new JPanel(); 
    scrollPane.setViewportView(systemsPanel); 
    systemsPanel.setLayout(new GridLayout(8, 1, 0, 0)); //8 rows for now 



    for (int i = 1; i < 50; i++) { 
     systemsPanel.add(new JButton("test"), "cell 0 " + i); 
    } 
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
    this.setLocation(dim.width/2 - this.getSize().width/2, dim.height/2 - this.getSize().height/2); //Center the Frame 

} 
+2

は[MCVE]の有効なを作成して投稿してくださいすぐに最高のヘルプを得るための最良のチャンスです。このコードは小さくて自立しており、あなたの質問にはリンクではなくコード形式のテキストとしてここに投稿します。がんばろう! –

+3

GridLayoutは正常に動作するはずですが、正しく使用していない可能性があります。ここでもコード内でどのように使用するかを示してください。また、あなたはJTableを使用したくないと確信していますか? –

+0

あなたは間違っています。あなたが間違ってやっていることや正しい仮定がないことがわかります。再度、関連するコードを表示してください。そして、[ヘルプ]セクション、特にこのサイトで質問する方法のサブセクションをご覧ください。 –

答えて

2

あなたはGUIへのJPanelの行を追加したい場合は、私がのGridLayout(0、1)、または(0、1、x、y)を使用してのJPanelに配置します。 0は可変数の行を意味し、1は1列を意味し、xとyは垂直と水平の間隔です。私はこれをBorderLayoutに配置し、JPanelをNORTH位置に配置して、行がスクロールペインのビューポートを埋めるように展開しないようにします。この2番目のラッパーJPanelをJScrollPaneのビューポートに配置します。

コンポーネントを追加したら、コンテナのrevalidateとrepaintを呼び出して、レイアウトマネージャがアクティブにして新しいコンポーネントを配置して、再描画して、ぶら下がっている可能性のある汚れたピクセルを取り除きますコンポーネントを削除する)。

例えば、私のMCVE:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.*; 

public class AddRowA extends JPanel { 
    private static final int PREF_W = 650; 
    private static final int PREF_H = 400; 

    // JPanel to hold all rows. uses gridlayout that has 1 column and variable number 
    // of rows 
    private JPanel rowHolderPanel = new JPanel(new GridLayout(0, 1, 1, 1)); 

    public AddRowA() { 
     // outerPanel is a wrapper or container JPanel that is 
     // held by JScrollPane's viewport that holds the rowHolderPanel in 
     // a BorderLayout.PAGE_START location, so the rows don't expand unnecessarily 
     JPanel outerPanel = new JPanel(new BorderLayout()); 
     outerPanel.add(rowHolderPanel, BorderLayout.PAGE_START); 
     JScrollPane scrollPane = new JScrollPane(outerPanel); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 

     JPanel addPanel = new JPanel(); 
     addPanel.add(new JButton(new AddAction("Add"))); 

     setLayout(new BorderLayout()); 
     add(scrollPane, BorderLayout.CENTER); 
     add(addPanel, BorderLayout.PAGE_END); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class AddAction extends AbstractAction { 
     public AddAction(String name) { 
      super(name); 
      int mnemonic = (int) name.charAt(0); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JPanel panel = new JPanel(); 
      panel.add(new JLabel("Foo")); 
      panel.add(Box.createHorizontalStrut(25)); 
      panel.add(new JButton("Bar")); 
      panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3)); 

      rowHolderPanel.add(panel); 
      rowHolderPanel.revalidate(); 
      rowHolderPanel.repaint(); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Add Row A"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new AddRowA()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

しかし、その後、あなたはたとえば... JTableのを使用して方がいいでしょう:

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class AddRowB extends JPanel { 
    private MyTableModel tableModel = new MyTableModel(); 
    private JTable table = new JTable(tableModel); 

    public AddRowB() { 
     JPanel addPanel = new JPanel(); 
     addPanel.add(new JButton(new AddAction("Add"))); 

     setLayout(new BorderLayout()); 
     add(new JScrollPane(table)); 
     add(addPanel, BorderLayout.PAGE_END); 
    } 

    private class AddAction extends AbstractAction { 
     public AddAction(String name) { 
      super(name); 
      int mnemonic = (int) name.charAt(0); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      RowData row = new RowData("Type", "Address", "User ID"); 
      tableModel.addRow(row); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Add Row B"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new AddRowB()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

class MyTableModel extends DefaultTableModel { 
    private static final String[] COLUMNS = {"Type", "Address", "User ID"}; 

    public MyTableModel() { 
     super(COLUMNS, 0); 
    } 

    public void addRow(RowData rowData) { 
     Object[] row = { 
       rowData.getType(), 
       rowData.getAddress(), 
       rowData.getUserID() 
     }; 
     addRow(row); 
    } 
} 

class RowData { 
    String type; 
    String address; 
    String userID; 

    public RowData(String type, String address, String userID) { 
     this.type = type; 
     this.address = address; 
     this.userID = userID; 
    } 

    public String getType() { 
     return type; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public String getUserID() { 
     return userID; 
    } 

} 
+0

非常に有益なポスト、ありがとう! – 0Calories

関連する問題