7

JScrollPane に JTable があります。幅の広いテーブルとして、最小幅を約 600 にしたいと考えています。テーブル、スクロール ペイン、およびパネル自体の最小サイズを設定してみました。サイズがまったく変わらないのですが、何が欠けていますか? 出てくるのは列の幅を設定する方法だけなので、これをグーグルするのは難しいです。

ここに画像の説明を入力

コードは次のとおりです。

class SearchResults extends JPanel {

/**
 * Create the panel.
 */
public SearchResults() {
    setMinimumSize(new Dimension(640, 480));
    String[][] data= new String[][] {
            {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "VIEW BUTTON"},
            {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "VIEW BUTTON"}};
    String[] col = new String[] {
            "Last Name", "First Name", "Middle Initial", "Phone Number", "Email", "Project Title", "Project Description", "Amount", "Date Approved", "Date Completed", "College", "Faculty Mentor Name", "Co Grantee", "Major", "Travel Required", "Travel Purpose", "Travel Cost", "Travel Start Date", "Travel End Date", "View"};

      JTable table = new JTable(data,col);
      table.setMinimumSize(new Dimension(600,200));
      JTableHeader header = table.getTableHeader();
      JScrollPane pane = new JScrollPane(table);
      pane.setMinimumSize(new Dimension(600, 23));
      table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
      add(pane);
}

}

そして、ここでそれを JFrame に追加します。

public class Test extends JFrame
{

    public static void main(String[] args)
    {
        Test test = new Test();
        test.run();
    }

    public Test()
    {
        super("JAVA TEST!");
    }

    private void run()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        SearchResults resultsPanel = new SearchResults();
        resultsPanel.setMinimumSize(new Dimension(600,200));
        add(resultsPanel);
        setSize(800,600);
        setVisible(true);
    }
}
4

3 に答える 3

12

いくつかの問題があります:

  • (すでに私のコメントで述べたように)内側のパネルの FlowLayout は、常にその子のサイズをそれぞれの prefSize に合わせます
  • テーブルの最小/優先/最大幅は、それぞれの列サイズの合計から計算されます
  • テーブルはスクロール可能であり、preferredScrollableViewportSize (周囲の JScrollPane が独自の prefSize を計算するために使用するサイズ) を公開します。
  • prefScrollable の実装は ... 400 x 450 (または同様の) のようなものにハードコードされているという点で (穏やかに言えば) 欠けています。

したがって、微調整するネジがいくつかあります(すべての setXXSize 呼び出しを削除した後:))

  • パネルが BorderLayout を使用するようにします。フレームのサイズが変更された場合、scrollPane は領域全体を埋めます。
  • JTable を拡張して、prefScrollableViewportSize (表示される列/行の優先数に関して fi) に妥当なものを返します。

コード内 (および SwingX プロジェクトの JXTable を使用するのは、2 番目の API が既にあるためです :-) )

String[][] data= new String[][] {
        {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "VIEW BUTTON"},
        {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "VIEW BUTTON"}};
String[] col = new String[] {
        "Last Name", "First Name", "Middle Initial", "Phone Number", 
        "Email", "Project Title", "Project Description", "Amount", 
        "Date Approved", "Date Completed", "College", "Faculty Mentor Name", 
        "Co Grantee", "Major", "Travel Required", "Travel Purpose", 
        "Travel Cost", "Travel Start Date", "Travel End Date", "View"};

 JXTable table = new JXTable(data,col);
 table.setVisibleColumnCount(10);
 table.setHorizontalScrollEnabled(true);
 JScrollPane pane = new JScrollPane(table);
 JComponent comp = new JPanel(new BorderLayout());
 comp.add(pane);

編集

80% の要件を解決するには (および MigLayout のちょっとしたティーザー :-) )

// 80% with a minimum of 600 logical pixel:
MigLayout layout = new MigLayout("wrap 2, debug",
        "[600:pref, fill, grow][20%]");
JComponent comp = new JPanel(layout);
comp.add(pane, "spany");
comp.add(new JLabel("just something"));
于 2012-11-07T18:43:34.147 に答える
0

このものにもいくつかの問題がありました。も使用しsetPreferedSize(new Dimension(800,600));ます。これはあなたの問題を解決することができます

于 2012-11-07T18:11:02.113 に答える
0

レイアウトは重要です。NetbeansEclipseなどの IDEは、ドラッグ アンド ドロップによるハンズフリーのレイアウト設計を提供します。

Swing のレイアウトを理解すれば、コードでも実現できます。ここで言及している最も使用されているレイアウトはほとんどありません

BorderLayout
BoxLayout
FlowLayout
GridLayout

を追加するpanel.setLayout( new GridLayout(1,1));と、テーブルがフレーム内で固定されます。

また、何かを上書きしたり、フレームに何かを追加しJPanelたりしない限り、拡張する必要はありません。JFrame学ぶために練習します。

于 2012-11-07T18:42:35.043 に答える