Защо моята таблица не се вижда, когато е в JScrollPane?

Опитвам с часове, различни неща и търся навсякъде за решение, но не мога да накарам таблицата си в addScoreCardUpper() да се покаже. Получавам хоризонтална лента за превъртане, но без съдържание, само граница на стойност 2 пиксела.

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

public class YahtzeeGUI extends JFrame{
    /**
     * 
     */
    private static final long serialVersionUID = 3255683022699487295L;
    private JFrame frame;
    private JPanel panel;
    private JPanel dicePanel;
    private JScrollPane scrollPane;
    private JButton btnRoll;
    private JButton[] btnDice = new JButton[5];
    private JTable table;

    private Yahtzee y = new Yahtzee();

    public YahtzeeGUI(){
        createWindow();
        addButtonRoll();
        addButtonDice();
        addScoreCardUpper();
        //addScoreCardLower();


        frame.add(panel);
        frame.setVisible(true);
    }

    public void createWindow(){
        frame = new JFrame();
        frame.setTitle("Yahtzee");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1000,700);
        frame.setVisible(true);
        panel = new JPanel(new BorderLayout());
        dicePanel = new JPanel();
        scrollPane = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
    }

    public void addButtonRoll(){
        btnRoll = new JButton ("Roll the Dice");
        btnRoll.addActionListener(new RollHandler());

        dicePanel.add (btnRoll);
        panel.add(dicePanel, BorderLayout.SOUTH);
    }

    public void addButtonDice(){

        for (int i = 0; i < btnDice.length; i++){
            btnDice[i] = new JButton(String.valueOf(y.dice[i].getFaceValue()));
            btnDice[i].addActionListener(new HoldHandler());
            dicePanel.add (btnDice[i]);
        }
        panel.add(dicePanel, BorderLayout.SOUTH);
    }

    public void addScoreCardUpper(){
        String tableHeader[] = {"Upper Section", "How to score", "Score" };
        String tableValues[][] = {
                {"ONES", "Total of all Ones",""},
                {"TWOS", "Total of all Twos",""},
                {"THREES", "Total of all Threes",""},
                {"FOURS", "Total of all Fours",""},
                {"FIVES", "Total of all Fives",""},
                {"SIXES", "Total of all Sixes",""},
                {"TOTAL SCORE", "",""},
                {"BONUS", "",""},
                {"TOTAL + BONUS", "",""}
        };

        table = new JTable(tableValues, tableHeader);
        table.setEnabled(false);
        setColumnWidths();
        scrollPane.add(table); // Here is the offender
        panel.add(scrollPane, BorderLayout.EAST);
    }

    /*public void addScoreCardLower(){
        String tableHeader[] = {"Lower S", "How to score", "Score" };
        String tableValues[][] = {
                {"ONES", "Total of all Ones",""},
                {"TWOS", "Total of all Twos",""},
                {"THREES", "Total of all Threes",""},
                {"FOURS", "Total of all Fours",""},
                {"FIVES", "Total of all Fives",""},
                {"SIXES", "Total of all Sixes",""},
                {"TOTAL SCORE", "",""},
                {"BONUS", "",""},
                {"TOTAL + BONUS", "",""}
        };

        table = new JTable(tableValues, tableHeader);
        table.setEnabled(false);
        setColumnWidths();
        scoreSubPanel.add(table);
        panel.add(scoreSubPanel, BorderLayout.WEST);
    }*/

    public void setColumnWidths(){

        TableColumn a = table.getColumnModel().getColumn(0);
        TableColumn b = table.getColumnModel().getColumn(1);
        a.setPreferredWidth(100);
        b.setPreferredWidth(100);

    }

    class RollHandler implements ActionListener {

        public void actionPerformed(ActionEvent event) {

            for(int i = 0; i < y.dice.length; i++){
                if (y.dice[i].getHoldState() != true){
                    y.dice[i].roll();
                    btnDice[i].setText(String.valueOf(y.dice[i].getFaceValue()));
                }
            }
        }
    }

    class HoldHandler implements ActionListener {

        public void actionPerformed(ActionEvent event) {
            for (int i = 0; i < btnDice.length; i++){
                if (event.getSource()== btnDice[i]){ // Picks the pressed button after running through them all.
                    if (y.dice[i].getHoldState() == false){
                        y.dice[i].setHoldState(true);
                    } else if (y.dice[i].getHoldState() == true){
                        y.dice[i].setHoldState(false);
                    }
                }
            }
        }
    }

}

person bkrpage    schedule 23.03.2014    source източник
comment
Две вероятно несвързани неща, които забелязах, имате два JFrames, рамка на променливата на екземпляра и YahtzeeGUI, който разширява JFrame. Също така извиквате setVisible(true) два пъти, в конструктора и в createWindow, вероятно искате да извикате setVisible(true) само веднъж, когато съществува в момента в конструктора.   -  person NESPowerGlove    schedule 23.03.2014


Отговори (2)


Това е вашият проблем:

scrollPane.add(table);

Това не добавя JTable към изгледа на прозореца за изглед на JScrollPane, който е там, където искате, а по-скоро напълно замества прозореца за изглед на JScrollPane с JTable, което прави JScrollPane напълно нефункционален. Вместо това задайте таблицата като viewportview на JScrollPane:

scrollPane.setViewportView(table);

Направете или това, или прехвърлете таблицата в конструктора на JScrollPane, който прави почти същото:

JScrollPane scrollPane = new JScrollPane(table,
          ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
          ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

Всичко това е добре обяснено в JScrollPane API , и ще искате да го разгледате за важните подробности.


Редактиране
Вашият код също извиква setVisible(true) на JFrame, преди да добави всички компоненти, които могат да доведат до проблеми. Ще искате да избегнете това.

person Hovercraft Full Of Eels    schedule 23.03.2014
comment
Благодаря! Използвано scrollPane.setViewportView(table) накрая. Освен това благодаря за бележката setVisible(true), напълно бях забравил за това. - person bkrpage; 23.03.2014

Опитайте който и да е

scrollPane = new JScrollPane(table);

or

scrollPane = new JScrollPane(table,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

or

scrollPane.getViewport().add(table);
person Braj    schedule 23.03.2014
comment
Пробвах средния и се получи, благодаря. Въпреки това избрах scrollPane.setViewportView(table), тъй като това ще ми бъде по-лесно да се върна по-късно и да разбера. Благодаря отново - person bkrpage; 23.03.2014