JScrollpane виден только после максимизации окна Java Swing

Я использую JScrollPane для размещения внутри JTable некоторых значений, но JScrollPane должен быть невидимым, пока пользователь не нажмет кнопку. Но JScrollPane остается невидимым, пока я не максимизирую окно вручную. Я пробовал почти все, .validate(); .перепроверить(); .repaint()... Я использую Netbeans и в пользовательском коде JScrollPane я написал следующее:

scrollPane = new javax.swing.JScrollPane();
this.scrollPane.setVisible(false);
// El código de los subcomponentes y del gestor de distribución - no se muestra aquí

// El código que agrega el componente al contenedor superior - no se muestra aquí

Затем в MouseReleased:

private void botoGeneraLlistatMouseReleased(java.awt.event.MouseEvent evt) {
    this.generaLlistat();
}

И в конце generalLlistat():

public void generaLlistat(){{
   ...(Some code requesting data from DB)
   JTable table = new JTable(rows, headings);
   scrollPane.setViewportView(table);
   this.scrollPane.setVisible(true);
   statement.close();
   connection.close();
}

Я буду признателен за любую помощь :) Спасибо всем, и извините за мою английскую грамматику и орфографию.


person Aitor Gonzalez    schedule 31.08.2012    source источник


Ответы (4)


Попробуйте сделать так:

package stack;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Aitor extends JFrame implements ActionListener{
    JTable table;
    JPanel panel = new JPanel();
    JButton button = new JButton("Add"); 

    String data[][]={{"hey","hey"},{"hey","hey"},{"hey","hey"},{"hey","hey"},                        {"hey","hey"},{"hey","hey"}
,{"hey","hey"},{"hey","hey"},{"hey","hey"},{"hey","hey"},{"hey","hey"},{"hey","hey"},{"hey","hey"},{"hey","hey"}
,{"hey","hey"},{"hey","hey"}};
    String columns[] = {"First","Second"};

    public Aitor(){
        setLayout(new BorderLayout());
        panel.setLayout(new BorderLayout());
        panel.setPreferredSize(new Dimension(500,400));
        button.addActionListener(this);
        add(panel,BorderLayout.CENTER);
        add(button, BorderLayout.SOUTH);

    }

    public static void main(String [] a){
        Aitor aitor = new Aitor();
        aitor.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        aitor.pack();
        aitor.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        panel.removeAll();
        table =new JTable(data,columns);
        panel.add(new JScrollPane(table),BorderLayout.CENTER);
        repaint();
        revalidate();
    }
}
person Branislav Lazic    schedule 31.08.2012
comment
О, извините за мою невоспитанность, я был очень эмоционален в тот момент. Спасибо - person Aitor Gonzalez; 18.09.2012

Вы можете просто вызвать pack() в своем контейнере после вызова setVisible(true), и появится ваша панель прокрутки.

person Reimeus    schedule 31.08.2012
comment
вызов pack(), безусловно, работает, единственным недостатком этого подхода является то, что пользовательский интерфейс перейдет в режим «Восстановление». Это создает проблему, если вы хотите, чтобы ваш пользовательский интерфейс был в развернутом режиме. Используя 'setExtendedState (MAXIMIZED_BOTH);' сразу после pack() должно помочь. - person Stack2Heap; 15.04.2020

Вы можете использовать setPreferredScrollableViewportSize(), как показано здесь и здесь, хотя у него есть некоторые из тех же недостатков, упомянутых здесь.

person trashgod    schedule 31.08.2012

Попробуйте эту кодировку, если вы не используете jframe.

В методе конструктора дайте

Jscrollpane.setVisible (false);

Укажите конкретное jscrollpane, связанное с вашим jtable в jframe.

Затем в методе actionperformed дайте

Jscrollpane. setvisible (true); 
pack (); 

Помогло бы.....

person user3289859    schedule 09.02.2014