2016-07-22 5 views
0

У меня есть JDialog с двумя панелями: JTable и кнопка. Я хочу установить JDialog так, что (maxHeight= 600 pixels).Java подходит JDialog для JTable, если размер таблицы меньше заданного значения

(1) Если высота стола меньше, чем maxLength он показывает таблицу полностью, без пустого пространства, но все строки вписываются в

(2) Если высота больше maxHeight, он ограничивает высоту до maxHeight и показывает полосу прокрутки сбоку.

До сих пор у меня большая часть работы JDialog, но я не могу понять, как управлять высотой JTable.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 

public class TestGUI { 

    public static void main(String[] args) {   
     int a=10;   

     Object[][] data = new Object[a][2];  //Fill table with some data 
     for (int i = 0; i < a; i++) {data[i][0]=i; data[i][1]=i*i; }   

     JDialog dialog = new JDialog(); 
     dialog.setLayout(new BorderLayout()); 

     String[] header = {"Number", "Square"};   
     DefaultTableModel model = new DefaultTableModel(data, header); 
     JTable table = new JTable(model); 

     table.setPreferredScrollableViewportSize(new Dimension(450, 600));   

     table.setFillsViewportHeight(true); 
     JScrollPane js = new JScrollPane(table); 
     js.setVisible(true); 

     dialog.add(js, BorderLayout.CENTER); 

     JButton okButton = new JButton(new AbstractAction("OK") { 
      private static final long serialVersionUID = 1L; 
      public void actionPerformed(ActionEvent e) { 
       dialog.setVisible(false); 
      } 
     }); 
     JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(okButton); 
     dialog.add(buttonPanel, BorderLayout.SOUTH); 
     //dialog.setSize(new Dimension(300, 600)); 
     dialog.setMinimumSize(new Dimension(255, 175)); 
     dialog.setVisible(true); 
    } 
} 
+0

Я думаю, что вы забыли называть 'dialog.pack();' после добавления ваших компонентов в диалог. – VGR

+0

@ VGR Pack не поможет, потому что я хочу указать поведение таблицы, а не весь диалог. Кроме того, где бы я набрал maxHeight? – sixtytrees

ответ

1

Размеры жесткого диска практически никогда не являются хорошей идеей. У других пользователей не будет таких же шрифтов, как у вас, и даже те, кто это делает, могут использовать разные размеры шрифта. (12-ти точечный шрифт - это шрифт, строки которого имеют текст/дюйм высотой, поэтому даже если пользователь имеет тот же шрифт, шаг точки пользовательского монитора может влиять на количество пикселей, которое использует каждый символ.)

Вместо maxHeight задайте переменную maxVisibleRows. Ваша таблица должна использовать getRowHeight, чтобы вычислить ее размер на основании требуемого количества строк:

int visibleRows = model.getRowCount(); 
visibleRows = Math.max(1, visibleRows); 
visibleRows = Math.min(maxVisibleRows, visibleRows); 

Dimension size = table.getPreferredScrollableViewportSize(); 
size.height = table.getRowHeight() * visibleRows; 
table.setPreferredScrollableViewportSize(size); 

Теперь ваш JTable, и его ограждающих JScrollPane, будет иметь нужный размер в соответствии с того, что я думаю, что вы ищете, что означает, вы можете (и должны) использовать pack().

dialog.pack(); 
dialog.setResizable(false); 

Если таблица потенциально может иметь много строк, вы должны рассмотреть во избежание каких-либо ограничений на размер JDialog. Если есть сотни строк, пользователи не оценят, что вынуждены смотреть только по восемь за раз.

+0

Это именно то, что я искал. Спасибо!. – sixtytrees

 Смежные вопросы

  • Нет связанных вопросов^_^