2014-09-14 2 views
2

У меня есть JTable с несколькими столбцами и потенциально очень много строк. Я хочу отображать только 3 строки за раз, и я хочу, чтобы ширина JTable составляла 400, , включая ширину полосы прокрутки.JTable внутри JScrollPane с фиксированной шириной

Вот код, который я до сих пор:

public class SwingDrivesMeMad 
{ 
    public static void main(String[] args) 
    { 
     Object[][] rowData = { {"Homer", "beer"}, 
           {"Marge", "wine"}, 
           {"Bart", "coke"}, 
           {"Lisa", "water"}, 
           {"Maggie", "milk"} }; 
     Object[] headerData = { "name", "beverage" }; 

     JTable table = new JTable(rowData, headerData) 
     { 
      public Dimension getPreferredScrollableViewportSize() 
      { 
       return new Dimension(400, getRowHeight() * 3); 
      } 
     }; 

     JScrollPane scrollPane = new JScrollPane(table); 
     JFrame frame = new JFrame("learn you a barkeep for great good!"); 
     frame.add(scrollPane); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

Вот как это выглядит:

Высота совершенен. К сожалению, ширина 400 плюс ширина полосы прокрутки, в общей сложности 415. Это испортит макет, потому что есть графическая область с фиксированной шириной 400 непосредственно над таблицей, и оба компонента должны выстраиваться в линию в совершенстве. Наличие стола немного больше, просто выглядит плохо.

Конечно, я мог бы просто установить ширину 385, потому что в моей системе полосы прокрутки занимают 15 пикселей, но это не кажется очень портативным. Есть ли лучшее решение?

+0

Вы пытались установить размер 'JScrollPane' вместо' JPanel'? – msrd0

+0

Как установить его на жесткий кабель на 385 пикселей менее портативный, чем на 400? –

+0

@ msrd0 Это отлично работает для ширины, но не для высоты, потому что заголовок не учитывается. Как получить высоту заголовка? 'scrollPane.getColumnHeader(). getHeight()' вызывает 'NullPointerException'. Кроме того, я не эксперт по Swing, но я читал бесчисленное количество раз, что 'setXXXSize' является злым. – fredoverflow

ответ

1

К сожалению, ни одно из предлагаемых решений не было пиксельным. Итак, я придумал взломать:

Как насчет того, чтобы сначала пробовать ширину 400, затем рассчитать фактическую ширину и, наконец, исправить избыток?

JTable table = new JTable(rowData, headerData) 
{ 
    private static final int DESIRED_WIDTH = 400; 

    Dimension dim = new Dimension(DESIRED_WIDTH, Integer.MAX_VALUE); 

    { 
     JScrollPane dummy = new JScrollPane(this); 
     dummy.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     JFrame frame = new JFrame(); 
     frame.add(dummy); 
     frame.pack(); 
     int actualWidth = dummy.getSize().width; 
     frame.dispose(); 
     int excess = actualWidth - DESIRED_WIDTH; 
     dim = new Dimension(DESIRED_WIDTH - excess, getRowHeight() * 3); 
    } 

    public Dimension getPreferredScrollableViewportSize() 
    { 
     return dim; 
    } 
}; 

Теперь scrollPane.getSize().width именно 400. Да, это хак. Но эй, это работает!

+0

. Я бы создал новый класс для этого вместо создания Anonymus Inner Type – msrd0

+0

@ msrd0 Согласовано, это было просто для демонстрационных целей , – fredoverflow

+0

Конечно, и все, кто не является новичком в Java, поймут, но я бы отредактировал его, чтобы сделать его более полезным для Java Beginners – msrd0

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