Добавить JButton в JScrollPame - PullRequest
0 голосов
/ 11 июля 2019

У меня есть следующий код, взятый из GeeksforGeeks, который отображает содержимое двумерного массива в JTable с использованием JScrollPane:

public class JTableExamples { 
// frame 
JFrame f; 
// Table 
JTable j; 

// Constructor 
JTableExamples() 
{ 
    // Frame initiallization 
    f = new JFrame(); 

    // Frame Title 
    f.setTitle("JTable Example"); 

    // Data to be displayed in the JTable 
    String[][] data = { 
        { "Kundan Kumar Jha", "4031", "CSE" }, 
        { "Anand Jha", "6014", "IT" } 
    }; 

    // Column Names 
    String[] columnNames = { "Name", "Roll Number", "Department" };

    // Initializing the JTable 
    j = new JTable(data, columnNames); 
    j.setBounds(30, 40, 200, 300); 

    // adding it to JScrollPane 
    JScrollPane sp = new JScrollPane(j); 
    f.add(sp); 
    // Frame Size 
    f.setSize(500, 200); 
    // Frame Visible = true 
    f.setVisible(true); 
} 

Что я пытаюсь сделать, это добавить простой компонент (например, JButton)под столом, но это не похоже на работу.Я попытался изменить код, добавив JButton в JPanel и добавив JPanel во фрейм:

   JButton button = new JButton("Back");
   JPanel panel = new JPanel();
   panel.add(button);
   f.add(sp);
   f.add(panel); 

Но это просто удаляет всю таблицу и заменяет ее одной кнопкой.Я также попытался добавить кнопку в JPanel и добавить эту JPanel в JScrollPane:

   JButton button = new JButton("Back");
   JPanel panel = new JPanel();
   panel.add(button);
   sp.add(panel);
   f.add(sp);

Но, похоже, это ничего не изменило.Я также пытался возиться с предпочтительным и максимальным размером JScrollPanel, но безрезультатно - он всегда занимает весь экран и не дает JButton появляться на экране.

Не для дизайна здесь, только для функциональности: пусть JButton появится под моим JTable.Любые предложения будут с благодарностью.Заранее спасибо!

1 Ответ

1 голос
/ 11 июля 2019

Диспетчером макета JFrame по умолчанию является BorderLayout.

f.add(sp);
f.add(panel); 

Если вы не задаете ограничение для BorderLayout, предполагается CENTER.Вы можете добавить только один компонент к CENTER.

Вместо этого ваш код должен быть:

f.add(sp, BorderLayout.CENTER);
f.add(panel, BorderLayout.PAGE_END); 

Обратите внимание, что менеджером по умолчанию для JPanel является FlowLayout,Таким образом, кнопка будет горизонтально центрирована на панели.

Кроме того, вместо использования JPanel, попробуйте добавить кнопку непосредственно к PAGE_END кадра, чтобы увидеть разницу.

Прочтите раздел из учебного пособия по Swing на Использование Layout Manager для получения дополнительной информации и примеров использования каждого из различных менеджеров компоновки для понимания различий в приведенных выше предложениях.

Редактировать:

Есть ли способ уменьшить высоту стола

Если вы знаете, что у вас маленький стол, вы можете использовать:

table.setPreferredScrollableViewportSize(table.getPreferredSize());

Это сделает область прокрутки размером с таблицу.

Затем вы используете:

//f.setSize(500, 200); 
f.pack();

Теперь все компоненты будут отображаться в их предпочтительном размере.

...