1

ベータテスターが私に送信するデータを表示するための JFrame (この部分は既に行っています) と、チャート用の JTabbedPane (彼らが使用するため) を作成しようとしています。//ルック アンド フィール (およびカラーリング; 怠惰すぎて画像全体にカラーリングすることができなかった) などを無視して、次のようになることを望んでいます。ここに画像の説明を入力

. //JComboBox に CardLayout を使用して、別のテーブルと新しく選択されたモードの別の JTabbedPane を表示する必要があります。つまり、2 つのテーブルと 2 つの JTabbedPanes です。

私は、このセットアップの小さな (非常に単純化された!) 例、(非常に単純な!) JTabbedPane と小さな JTable のみを持つ JFrame を作成しようとしました。この例は、JPanel (両方のコンポーネントを収容する) に BorderLayout を指定すると機能しますが、GridLayout (または GridBagLayout //最終的に使用することになるレイアウト) を指定するとすぐに、最後のコンポーネントのみが表示されます。やってみる! どうしてこれなの?

それが役立つ場合(私がこれにどれだけの初心者であるかを考えると、そうかもしれません)、サンプルコードは次のとおりです。

JPanelLayoutTest.java

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

import javax.swing.JTable;

public class JPanelLayoutTest extends JFrame {

private JPanel aPanel;
private JTabbedPane tabbedPane;
private JTable someTable;

public JPanelLayoutTest(String title) throws HeadlessException {
    super(title);
    aPanel = setupPanel();
}

private JPanel setupPanel()
{
    GridBagLayout gridBag = new GridBagLayout();
    GridBagConstraints constraints = new GridBagConstraints();
    //making the panel have two columns and one row
    JPanel panel = new JPanel(gridBag);
    //add someTable to top
    someTable = new JTable(new SampleTableModel());
    /*JPanel somePanel = new JPanel();
    somePanel.add(new JScrollPane(someTable));*/
    constraints.gridx = 0;
    constraints.gridy = 0;
    constraints.gridheight = 1;
    constraints.gridwidth = 1;
    gridBag.setConstraints(new JScrollPane(someTable), constraints);
    add(new JScrollPane(someTable));
    //add tabbedPane to bottom
    tabbedPane = new JTabbedPane();
    tabbedPane.addTab("some component", new JLabel("some text"));
    /*JPanel someOtherPanel = new JPanel();
    someOtherPanel.add(tabbedPane);*/
    constraints.gridy = 1;
    gridBag.setConstraints(tabbedPane, constraints);
    add(tabbedPane);
    //add(tabbedPane);
    return panel;
}

public void turnOnWindow()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    //setSize(400,200);
    pack();

}

public static void main(String[] args) {
    JPanelLayoutTest frame = new JPanelLayoutTest("JPanel Layout Test");
    frame.turnOnWindow();
}
}
//Pardon the indentation; I wish this forum had support for the [code][/code] tag

SampleTableModel.java

import javax.swing.table.AbstractTableModel;

public class SampleTableModel extends AbstractTableModel {

//declaring the static arrays that will be the data for the table
private final String[] columnNames = {"Account", "Full Name", "Balance"};
private final int[] acctNumbers = {1000443749, 190238420, 928355};
private final String[] fullNames = {"Mike Warren", "Jack Smith", "Sarah Brown"};
private final double[] acctBalances = {193.38, 289.28, 21034.29};

public SampleTableModel() 
{
    // I do nothing in here; there is no reason to.
}

@Override
public int getColumnCount() { return columnNames.length; }

@Override
public int getRowCount() { return acctNumbers.length; }

@Override
public Object getValueAt(int row, int column) {
    switch (column)
    {
        case 0:
            return new Integer(acctNumbers[row]);
        case 1:
            return fullNames[row];
        case 2:
            return new Double(acctBalances[row]);
        default:
            return null;    //there should be no way the code would ever reach here
    }   
}

@Override
public String getColumnName(int index) { return columnNames[index]; }
    //Again, forgive my horrible indentation near the end here...
}
4

2 に答える 2

3

それ以外の:

private JPanel setupPanel()
{
GridBagLayout gridBag = new GridBagLayout();
GridBagConstraints constraints = new GridBagConstraints();
//making the panel have two columns and one row
JPanel panel = new JPanel(gridBag);
//add someTable to top
someTable = new JTable(new SampleTableModel());
/*JPanel somePanel = new JPanel();
somePanel.add(new JScrollPane(someTable));*/
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridheight = 1;
constraints.gridwidth = 1;
gridBag.setConstraints(new JScrollPane(someTable), constraints);
add(new JScrollPane(someTable));
//add tabbedPane to bottom
tabbedPane = new JTabbedPane();
tabbedPane.addTab("some component", new JLabel("some text"));
/*JPanel someOtherPanel = new JPanel();
someOtherPanel.add(tabbedPane);*/
constraints.gridy = 1;
gridBag.setConstraints(tabbedPane, constraints);
add(tabbedPane);
//add(tabbedPane);
return panel;
}

JPanel の拡張機能としてパネルを構築する方がうまくいくと思います。さまざまなシナリオでコンストラクターをオーバーロードできます。

//You can call new objects such as:
new MyPanel(data, otherComponent);



public class MyPanel extends JPanel{
    String data;

    public MyPanel(String someData, SomeOtherClass aClass){
    this.data = someData;
    setLayout(new GridBagLayout());
    GridBagConstraints constraints = new GridBagConstraints();
    JPanel panel = new JPanel(gridBag);

    //New addition
    constraints.gridx = 0;
    constraints.gridy = 0;
    //add components to the JPanel with your grid (constraints)
    add(new JScrollPane(someTable), constraints)

    //New addition
    constraints.gridx = 0;
    constraints.gridy = 1;
    //add components to the JPanel with your grid (constraints)
    add(tabbedPane , constraints);

    }

    public String getData(){
        return this.data;
    }
}

これは MVC パターンに従います (より多くのスイングを設計する予定がある場合は、これを検討することをお勧めします)。私はそれが本当に私を助けたことを知っています!

于 2013-06-30T07:09:07.323 に答える
2

あなたの問題

GridBagLayout (および他の多くのレイアウト) を使用する場合、特定のコンポーネントに使用する制約を渡す必要があります。そうしないと、レイアウト マネージャーはデフォルト値を使用します。

たとえば、あなたがやっている...

gridBag.setConstraints(new JScrollPane(someTable), constraints);
add(new JScrollPane(someTable));

ただし、追加するコンポーネントは、制約を適用したコンポーネントではありません。代わりに、もっと似たようなことをしてください...

add(new JScrollPane(someTable), constraints);

(可能な)より良い解決策

UI をセクションに分割します。各セクションには独自の要件があります (3 つのセクションがあります)。

は、UI の 3 つのセクションを表す 3 つの追加パネルを追加する基本レイアウトとして表示GridLayoutされます。

これは、一連のレイアウトを構築して最終結果を生成するため、一般に複合レイアウトとして知られています。

于 2013-06-30T06:55:26.207 に答える