Добавление JScrollPane в JTable

Привет, этот вопрос может показаться дубликатом, но на самом деле это не так, поскольку я уже пробовал предложения по другим вопросам, подобным этому. Может ли кто-нибудь помочь мне отладить мой код, вот мой код:

import java.awt.*;

import javax.swing.*;
import javax.swing.border.MatteBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

// This is the Panel that contains represents the view of the
// Music Store

public class PosPanel extends JPanel {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    // These are the components
    private JLabel      billNumber;
    private JButton     submitButton;
    private JButton     changeViewButton;
    private JButton     addItemButton;
    private JTable      table;



    public JButton getsubmitButton() {
        return submitButton;
    }

    public JLabel getBillNumber() {
        return billNumber;
    }
    public JButton getAddItemButton() {
        return addItemButton;
    }

    public JButton getChangeViewButton() {
        return changeViewButton;
    }
    public void setChangeViewButton(JButton changeViewButton) {
        this.changeViewButton = changeViewButton;
    }
    public JTable getTable() {
        return table;
    }

    public PosPanel(){
        super();

        // Use a GridBagLayout (lotsa fun)
        GridBagLayout layout = new GridBagLayout();
        GridBagConstraints layoutConstraints = new GridBagConstraints();
        setLayout(layout);

        billNumber = new JLabel("Invoice #1");
        layoutConstraints.gridx = 0;
        layoutConstraints.gridy = 0;
        layoutConstraints.gridwidth = 1;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(10, 10, 10, 10);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 0.05;
        layout.setConstraints(billNumber, layoutConstraints);
        add(billNumber);

        changeViewButton = new JButton("Exchange/Return");
        layoutConstraints.gridx = 1;
        layoutConstraints.gridy = 0;
        layoutConstraints.gridwidth = 1;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 0.05;
        layout.setConstraints(changeViewButton, layoutConstraints);
        add(changeViewButton);

        addItemButton = new JButton("Add Item");
        layoutConstraints.gridx = 2;
        layoutConstraints.gridy = 0;
        layoutConstraints.gridwidth = 1;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 0.05;
        layout.setConstraints(addItemButton, layoutConstraints);
        add(addItemButton);

        submitButton = new JButton("Submit");
        layoutConstraints.gridx = 0;
        layoutConstraints.gridy = 8;
        layoutConstraints.gridwidth = 3;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 0.05;
        layout.setConstraints(submitButton, layoutConstraints);
        add(submitButton);



        table = new JTable(new MyTableModel());
        int[] alignments = new int[] { JLabel.LEFT, JLabel.CENTER, JLabel.RIGHT };
        table.getTableHeader().getColumnModel().getColumn(0)
        .setHeaderRenderer(new HeaderRenderer(table, alignments[0]));
        table.getTableHeader().getColumnModel().getColumn(2)
        .setHeaderRenderer(new HeaderRenderer(table, alignments[1]));

        table.getTableHeader().setFont(new Font("Times New Roman", Font.BOLD, 28));
        table.setFont(new Font("Times New Roman", Font.PLAIN, 20));
        table.getColumnModel().getColumn(0).setMinWidth(350);
        table.getColumnModel().getColumn(0).setMaxWidth(350);
        table.getColumnModel().getColumn(2).setMinWidth(135);
        table.getColumnModel().getColumn(2).setMaxWidth(135);
        table.getColumnModel().getColumn(3).setMinWidth(125);
        table.getColumnModel().getColumn(3).setMaxWidth(125);
        table.getColumnModel().getColumn(4).setMinWidth(155);
        table.getColumnModel().getColumn(4).setMaxWidth(155);
        table.setRowHeight(30);

        DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
        rightRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        table.getColumn("Quantity").setCellRenderer( rightRenderer );       
        table.getColumn("Price").setCellRenderer( rightRenderer );      
        table.getColumn("Item Total").setCellRenderer( rightRenderer );     

        table.setShowGrid(true);
        Color color = Color.black;
        MatteBorder border = new MatteBorder(1, 1, 0, 0, color);
        table.setBorder(border);
        table.setGridColor(color);
        table.setFillsViewportHeight(true);

        layoutConstraints.gridx = 0;
        layoutConstraints.gridy = 3;
        layoutConstraints.gridwidth = 3;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 1.0;
        layout.setConstraints(table, layoutConstraints);

        layoutConstraints.gridx = 0;
        layoutConstraints.gridy = 2;
        layoutConstraints.gridwidth = 4;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 0;
        layoutConstraints.weighty = 0;
        layout.setConstraints(table.getTableHeader(), layoutConstraints);


        JScrollPane pane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

        layoutConstraints.gridx = 0;
        layoutConstraints.gridy = 3;
        layoutConstraints.gridwidth = 3;
        layoutConstraints.gridheight = 1;
        layoutConstraints.fill = GridBagConstraints.BOTH;
        layoutConstraints.insets = new Insets(0, 0, 0, 0);
        layoutConstraints.anchor = GridBagConstraints.EAST;
        layoutConstraints.weightx = 1.0;
        layoutConstraints.weighty = 1.0;
        layout.setConstraints(pane, layoutConstraints);


        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        add(table);     
        add(table.getTableHeader());
        add(pane);    
    }

    public void tableReset() {

        table.setModel(new MyTableModel());

        int[] alignments = new int[] { JLabel.LEFT, JLabel.CENTER, JLabel.RIGHT };
        table.getTableHeader().getColumnModel().getColumn(0)
        .setHeaderRenderer(new HeaderRenderer(table, alignments[0]));

        table.getTableHeader().getColumnModel().getColumn(2)
        .setHeaderRenderer(new HeaderRenderer(table, alignments[1]));

        table.getTableHeader().setFont(new Font("Times New Roman", Font.BOLD, 28));
        table.setFont(new Font("Times New Roman", Font.PLAIN, 20));
        table.getColumnModel().getColumn(0).setMinWidth(350);
        table.getColumnModel().getColumn(0).setMaxWidth(350);
        table.getColumnModel().getColumn(2).setMinWidth(135);
        table.getColumnModel().getColumn(2).setMaxWidth(135);
        table.getColumnModel().getColumn(3).setMinWidth(125);
        table.getColumnModel().getColumn(3).setMaxWidth(125);
        table.getColumnModel().getColumn(4).setMinWidth(155);
        table.getColumnModel().getColumn(4).setMaxWidth(155);
        table.setRowHeight(30);

        DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
        rightRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        table.getColumn("Quantity").setCellRenderer( rightRenderer );       
        table.getColumn("Price").setCellRenderer( rightRenderer );      
        table.getColumn("Item Total").setCellRenderer( rightRenderer );     
    }

    private static class HeaderRenderer implements TableCellRenderer {
        DefaultTableCellRenderer renderer;
        int horAlignment;
        public HeaderRenderer(JTable table, int horizontalAlignment) {
            horAlignment = horizontalAlignment;
            renderer = (DefaultTableCellRenderer)table.getTableHeader()
                    .getDefaultRenderer();
        }
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int col) {
            Component c = renderer.getTableCellRendererComponent(table, value,
                    isSelected, hasFocus, row, col);
            JLabel label = (JLabel)c;
            label.setHorizontalAlignment(horAlignment);
            return label;
        }
    }
}

[Обновление] В соответствии с запросом предложенный код из другого вопроса

Вертикальная полоса прокрутки в jTable swing не отображается

Горизонтальная полоса прокрутки не работает с JTable в Java Swing

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import java.io.*;

public class TableCreate extends JFrame
{
    JPanel mainPanel;
    TableCreate() throws IOException
    {

        mainPanel=new JPanel(new BorderLayout());
        String InputFile1 = "TableCreate.java";
        BufferedReader breader1 = new BufferedReader(new FileReader(InputFile1));
        String line1 = "";
        line1 = breader1.readLine();

        DefaultTableModel model1 = new DefaultTableModel();
        model1.addColumn("line");

        while((line1=breader1.readLine()) != null)
         {
             System.out.println(line1);
             model1.addRow(new Object[]{line1});
         }
         breader1.close();

        JTable tab=new JTable(model1);

        tab.setPreferredScrollableViewportSize(new Dimension(300, 200));
        tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        TableColumnAdjuster tca = new TableColumnAdjuster(tab);
        tca.adjustColumns();

        JScrollPane js = new JScrollPane(tab);
        add(js);
    }

    public static void main(String[] args) throws IOException
    {
        TableCreate tc=new TableCreate();
        tc.pack();
        tc.setVisible(true);
        tc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

person Noin    schedule 01.07.2015    source источник
comment
.. уже опробовали предложения по другим подобным вопросам stackoverflow. Какие еще вопросы, список (ссылки) на 3 верхних. Почему эти 3 не помогли решить эту проблему? Чтобы быстрее получить помощь, опубликуйте MCVE (минимальный полный проверяемый пример) или SSCCE (краткий, автономный, правильный пример).   -  person Andrew Thompson    schedule 01.07.2015
comment
new Font("Times New Roman", ..) лучше было бы new Font(Font.SERIF, ..) как для проверки времени компиляции, так и для кросс-платформенной надежности.   -  person Andrew Thompson    schedule 01.07.2015
comment
В чем ваша проблема на самом деле? Потому что ваш код не завершен и не может быть запущен.   -  person STaefi    schedule 01.07.2015
comment
Я вижу свой JTable, но не JScrollPane, я обновил код, это просто JPanel, который я добавляю в JFrame   -  person Noin    schedule 01.07.2015
comment
@Noin, пожалуйста, посмотри мой ответ.   -  person STaefi    schedule 01.07.2015


Ответы (1)


Какая-то очевидная проблема в вашем коде. Самый большой это:

В последних строках вы явно добавляете свою таблицу в базовый контейнер. Вы должны изменить следующую строку в своем классе PosPanel:

add(table);                  // remove this line
add(table.getTableHeader()); // remove this line
add(pane); // keep this line 

Обычно JTable следует добавлять в окно просмотра JScrollPane, чтобы показать его заголовок. Если вы добавите JTable отдельно в контейнер, заголовок будет невидимым.

Затем в контейнер следует добавить JScrollPane. Не добавляйте этот JTable снова в контейнер. Это будет работать. Если это не поможет, разместите здесь свой код для отладки.

Удачи.

person STaefi    schedule 01.07.2015
comment
Спасибо, это сработало, но пришлось удалить setConstraints для таблицы, table.getTableHeader() и панели. Как установить setConstraints без потери JScrollPane. Он также избавился от моей пользовательской ширины столбцов - person Noin; 01.07.2015
comment
Вы должны добавить эти ограничения, связанные с gridbaglayout, в JScrollPane вместо JTable. Поскольку панель прокрутки добавляется к панели и содержит JTable внутри своего окна просмотра. Также я помню, что работал с заголовком таблицы, и он вел себя так, как я ожидал. Я не могу отладить ваш неполный код, чтобы решить проблему размеров ваших столбцов. - person STaefi; 01.07.2015