Какое лучшее правило для установки динамического JTable внутри диалога или кадра? (Высота)

Я хочу рассчитать высоту диалогового окна, содержащего только таблицу, в зависимости от того, сколько строк она имеет, поэтому я использую правило перекрестного умножения. Например, я сначала проверю, что моя таблица хорошо вписывается в диалог (без пробела внизу) для некоторого значения, и после этого я использую правило перекрестного умножения, потому что данные являются динамическими. Но, к сожалению, это правило не решает проблему. Какое лучшее правило для установки динамической таблицы внутри диалогового окна или кадра? Вот мой код

public class FlowLayoutChangingGap {
 public static void main(String[] args) {
 // just for testing perpose but data are getting from database and it dynamic
 Object[][] data = {
 {"Kathy", "Smith", "Snowboarding", new Integer(5)},
 {"John", "Doe", "Rowing", new Integer(3)},
 {"Sue", "Black", "Knitting", new Integer(2)},
 {"Jane", "White", "Speed reading", new Integer(20)},
 {"Joe", "Brown", "Pool", new Integer(10)}};

 Object[] columnNames = {"firstname", "lastname", "age"};
 final JTable table = new JTable(data, columnNames);
 JFrame aWindow = new JFrame("This is a Test");
 aWindow.setBounds(50, 50, 500, 500);
 aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 FlowLayout flow = new FlowLayout(FlowLayout.LEFT, 20, 30);
 Container content = aWindow.getContentPane();
 content.setLayout(flow);
 JButton jButton = new JButton("Press Me");
 ActionListener l = new ActionListener() {

 public void actionPerformed(ActionEvent e) {
 JPanel jPanel = new JPanel();
 jPanel.setLayout(new GridBagLayout());
 GridBagConstraints gbc = new GridBagConstraints();
 gbc.anchor = GridBagConstraints.NORTHWEST;
 gbc.fill = GridBagConstraints.BOTH;
 gbc.gridx = 0;
 gbc.gridy = 0;
 gbc.weightx = 1.0;
 gbc.weighty = 1.0;
 jPanel.add(table, gbc);
 JDialog jdialog = new JDialog();
 jdialog.setContentPane(jPanel);

 jdialog.setLocationRelativeTo(null);
 int height = table.getModel().getRowCount() * 25;
 jdialog.setSize(400, height);
 jdialog.setVisible(true);

 }
 };
 jButton.addActionListener(l);
 content.add(jButton);
 aWindow.setVisible(true);
 }
}
1 ответ

Вот способ исправить количество строк, отображаемых на панели прокрутки.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

class FlowLayoutChangingGap {

 public static final int ROWS = 3;

 FlowLayoutChangingGap() {
 // just for testing perpose but data are getting from database and it dynamic
 Object[][] data = {
 {"Kathy", "Smith", "Snowboarding", new Integer(5)},
 {"John", "Doe", "Rowing", new Integer(3)},
 {"Sue", "Black", "Knitting", new Integer(2)},
 {"Jane", "White", "Speed reading", new Integer(20)},
 {"Joe", "Brown", "Pool", new Integer(10)}};
 Object[] columnNames = {"firstname", "lastname", "age"};
 final JTable table = new JTable(data, columnNames) {

 @Override
 public Dimension getPreferredScrollableViewportSize() {
 Dimension d = getPreferredSize();
 // Note: margin is included in rowHeight
 int n = getRowHeight(); // + getRowMargin();
 // tbd: insets? we are one-off here
 return new Dimension(d.width, (n * ROWS));
 }
 };
 JPanel jPanel = new JPanel();
 jPanel.setBorder(new EmptyBorder(6, 6, 6, 6));
 jPanel.setLayout(new GridLayout());
 JScrollPane sp = new JScrollPane(table);
 //sp.getViewport().
 jPanel.add(sp);
 JDialog jdialog = new JDialog();
 jdialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
 jdialog.setContentPane(jPanel);

 jdialog.setLocationRelativeTo(null);
 jdialog.pack();
 jdialog.setVisible(true);
 }

 public static void main(String[] args) {
 Runnable r = new Runnable() {

 @Override
 public void run() {
 new FlowLayoutChangingGap();
 }
 };
 // Swing GUIs should be created and updated on the EDT
 // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
 SwingUtilities.invokeLater(r);
 }
}

licensed under cc by-sa 3.0 with attribution.