2013-05-20 5 views
2

У меня есть JPanel с GridBagLayout. Панель содержит 2 строки, первая строка имеет JLabel, а вторая строка имеет JScrollPane с JTable внутри. Таблица не заполняет 100% прокрутки. Даже я изменяю размер рамки, scrollpane изменяет размер, но таблица внутри всегда имеет фиксированную ширину.JTable не заполняет JScrollPane, который добавляется к JPanel, используя GridBagLayout

JTable table=new JTable(myModel); 
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
JScrollPane scroll=new JScrollPane(table); 

JPanel panel=new JPanel(new GridBagLayout()); 
// component add details skipped 

И следующие ограничения сумм сетки, применяемые к области прокрутки, при добавлении к панели.

GridBagConstraints gbc=new GridBagConstraints(); 
gbc.gridx=0; // first column 
gbc.gridy=1; // second row 
gbc.gridwidth=1; 
gbc.gridheight=1; 
gbc.fill=GridBagConstraints.BOTH; 
gbc.anchor=GridBagConstraints.NORTHEAST; 
gbc.weightx=1.0; 
gbc.weighty=1.0; 

Что пошло не так? Проблема заключается в области прокрутки или таблицы?

+0

Добавили ли вы ScrollPane к панели? – Azad

+0

Да, и панель имеет gridbaglayout – Sridhar

+1

Для лучшей помощи, скорее всего, отправьте сообщение [SSCCE] (http://sscce.org/). –

ответ

2

Благодарим за предоставление ценных предложений. Я нашел точное решение этой проблемы. Измените размер стола по своему размеру или размеру порта, в зависимости от того, что больше. Независимо от того, какой менеджер макетов вы используете, он работает нормально!

Решение есть таблица определяется getScrollableTracksViewportWidth() способом, как в примере ниже:

JTable table=new JTable(myModel){ 
public boolean getScrollableTracksViewportWidth() { 
    return getPreferredSize().width < getParent().getWidth(); 
} 
}; 
JScrollPane scroll=new JScrollPane(table); 
+0

У меня была проблема JTable, которая не была достаточно широкой, чтобы заполнить прокрутку, когда в ней не было строк. Это затруднило получение сообщений DragNDrop. Это фиксировало это отлично. – CasaDelGato

6

Я думаю, что только (уведомление строки никогда не будут изменены с помощью любых из LayoutManager, только столбцы)

c.fill = GridBagConstraints.BOTH; 
c.weightx = 1; 
c.weighty = 0; 

GBC не является правильным LayoutManager для JComponents реализует прокрутку, использует BorderLayout (эв GridLayout) для них JComponents

, например

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class JTableAndGBC { 

    private String[] columnNames = {"Source", "Hit", "Last", "Ur_Diff"}; 
    private JTable table; 
    private Object[][] data = {{"Swing Timer", 2.99, 5, 1.01}, 
     {"Swing Worker", 7.10, 5, 1.010}, {"TableModelListener", 25.05, 5, 1.01}}; 
    private DefaultTableModel model = new DefaultTableModel(data, columnNames); 

    public JTableAndGBC() { 
     JPanel panel = new JPanel(new GridBagLayout()); 
     table = new JTable(model); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.weightx = 1.0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     panel.add(table, gbc); 
     JFrame frame = new JFrame(); 
     frame.add(panel, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String args[]) throws Exception { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JTableAndGBC(); 
      } 
     }); 
    } 
} 

РЕДАКТИРОВАТЬ 1

  • JTable, JScollPane, JComboBox не возвращает разумный PreferredSize см моего кода редактирования, затем wokrs для всех LayoutManagers,

  • уведомления тщательно с table.setPreferredScrollableViewportSize(table.getPreferredSize());, я предлагаю, чтобы проверить, если измерение перегрузки желательно координаты или разрешение экрана или не перегружать :-),

  • иначе сокращаться с new Dimension(int, int) вместо table.getPreferredSize()

.

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class JTableAndGBC { 

    private String[] columnNames = {"Source", "Hit", "Last", "Ur_Diff"}; 
    private JTable table; 
    private Object[][] data = {{"Swing Timer", 2.99, 5, 1.01}, 
     {"Swing Worker", 7.10, 5, 1.010}, {"TableModelListener", 25.05, 5, 1.01}}; 
    private DefaultTableModel model = new DefaultTableModel(data, columnNames); 

    public JTableAndGBC() { 
     JPanel panel = new JPanel(new GridBagLayout()); 
     table = new JTable(model); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.weightx = 1.0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     JScrollPane pane = new JScrollPane(table); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     panel.add(pane, gbc); 
     JFrame frame = new JFrame(); 
     frame.add(panel, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String args[]) throws Exception { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JTableAndGBC(); 
      } 
     }); 
    } 
} 

EDIT 2

Я сильно предлагаю использовать BorderLayout, GridLayout

enter image description here

.

enter image description here

вместо GBC (JTable, JScollPane, JComboBox не возвращается разумные PreferredSize, необходимо переопределить GBC, брррр, не утруждая почему)

enter image description here.enter image description here

код BorderLayout

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableColumn; 

public class JTableAndGBC { 

    private String[] columnNames = {"Source", "Hit", "Last", "Ur_Diff"}; 
    private JTable table; 
    private Object[][] data = {{"Swing Timer", 2.99, 5, 1.01}, 
     {"Swing Worker", 7.10, 5, 1.010}, {"TableModelListener", 25.05, 5, 1.01}}; 
    private DefaultTableModel model = new DefaultTableModel(data, columnNames); 

    public JTableAndGBC() { 
     JPanel panel = new JPanel(new BorderLayout()/*(new GridBagLayout()*/); 
     table = new JTable(model); 
     //GridBagConstraints gbc = new GridBagConstraints(); 
     //gbc.weightx = 1.0; 
     //gbc.fill = GridBagConstraints.HORIZONTAL; 
     JScrollPane pane = new JScrollPane(table, 
       ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 
       ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     /*TableColumn firstColumn = table.getColumnModel().getColumn(0); 
     firstColumn.setMinWidth(150); 
     firstColumn.setMaxWidth(200); 
     TableColumn secondColumn = table.getColumnModel().getColumn(1); 
     secondColumn.setMinWidth(200); 
     secondColumn.setMaxWidth(250); 
     TableColumn thirdColumn = table.getColumnModel().getColumn(1); 
     thirdColumn.setMinWidth(50); 
     thirdColumn.setMaxWidth(100); */  
     table.setRowHeight(30); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     panel.add(pane/*, gbc*/); 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String args[]) throws Exception { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JTableAndGBC(); 
      } 
     }); 
    } 
} 
+0

Как вы скажете, проблема с панелью прокрутки? потому что в моем коде jscrollpane идеально изменяет размеры как по горизонтали, так и по вертикали. но jtable (который находится внутри jscrollpane) не работает. – Sridhar

+0

да, без каких-либо проблем, это базовые знания о том, как работает LayouotManagers – mKorbel

+0

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

0

Удалить линию

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

. Это приводит к фиксированному размеру таблицы.

+0

Это фактически не решает проблему. – Sridhar

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