Какое лучшее правило для установки динамического 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.