Как ограничить JButton, чтобы изменить его размеры в результате повторной проверки - PullRequest
3 голосов
/ 18 января 2012

У меня есть панель (с GridLayout ( 0,1 )), встроенная в JFrame.

Согласно моему требованию: -

  • Я добавляю(JButton, JTextArea) попарно на указанной выше панели.
  • Теперь при нажатии кнопки JButton любой пары необходимо удалить JTextArea, а при повторном щелчке JButton - снова добавить JTextArea.

Все работает нормально, за исключением двух перечисленных ниже проблем:

  1. Размеры JButton изменяются при повторной проверке.
  2. Начальные размеры JButton очень велики (Как ограничитьразмерность JButton)

Для справки взгляните на этот screenshot.

И, пожалуйста, найдите ниже измененные списки кодов: -

TestFrame.java

package com.test;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestFrame extends JFrame implements ActionListener{

    final JPanel panel ;

    private TestFrame() {
        setExtendedState(JFrame.MAXIMIZED_BOTH) ;
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) ;
        panel = new JPanel() ;
        panel.setLayout( new GridLayout(0, 1) ) ;

        for(int i = 1 ; i <= 3 ; ++i){
            TButton btn = new TButton("User " + i + " [Toggle Button for TextArea " + i + "] (Click)")  ;
            panel.add(btn) ;        btn.addActionListener(this) ;   panel.add(new JScrollPane(btn.getLoggingArea())) ;
        }

        add(panel, BorderLayout.CENTER) ;
        setVisible(true) ;
        setExtendedState(JFrame.MAXIMIZED_BOTH) ;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        TButton btn = (TButton) e.getSource() ;
        JPanel parent = (JPanel) btn.getParent() ;

        int index = getIndex(parent, btn) ;

        if(btn.isLoggingAreaVisible()){
            parent.remove( parent.getComponent(index + 1) ) ;
            btn.setLoggingAreaVisible(false) ;
        }else{
            parent.add(new JScrollPane(btn.getLoggingArea()), index + 1) ;
            btn.setLoggingAreaVisible(true) ;
        }

        parent.revalidate() ;
        parent.repaint() ;
    }

    private int getIndex(JComponent parent, Component btn) {

        Component []comps = parent.getComponents() ;

        for(int i = 0 ; i < comps.length ; ++i){
            if( comps[i].equals(btn) ){
                return i ;
            }
        }

        return -1 ;
    }

    public static void main(String[] args) {
        new TestFrame() ;
    }
}

TButton.java

package com.test;

import javax.swing.JButton;
import javax.swing.JTextArea;

public class TButton extends JButton{

    private JTextArea loggingArea ;
    private boolean loggingAreaVisible = true ;

    public TButton(String threadName) {
        super(threadName) ;
        initComponents(threadName) ;
    }

    public void initComponents(String threadName) {

        String str = "1. By default large buttons are displayed." + "\n" +
                     "    But, I want buttons with a little small dimensions." + "\n\n" +
                     "2. On click of above button, above button expands to cover space used by this textArea." + "\n" +
                     "    But, what I want, that button size does not changes onClick, only textArea length increases/decreases." ;
        loggingArea = new JTextArea(getText() + " textArea." + "\n\n" + str + "\n\n" + "Type Here...") ;
    }


    public boolean isLoggingAreaVisible() {
        return loggingAreaVisible;
    }

    public void setLoggingAreaVisible(boolean loggingAreaVisible) {
        this.loggingAreaVisible = loggingAreaVisible;
    }

    public JTextArea getLoggingArea() {
        return loggingArea;
    }
}

Спасибо, Rits:)

Ответы [ 3 ]

3 голосов
/ 18 января 2012
  1. Возврат JPanel (BorderLayout), вложенный
    • JPanel (по умолчанию FlowLayout) для JButton, это JPanel помещено в BorderLayout.NORTH
    • JTextArea положить на потом BorderLayout.CENTER
  2. Там я не вижу причины для revalidate & repaint, только в том случае, если вы переключаетесь между JComponents или удаляетеи затем добавьте новый JComponent(s),
  3. Для hide/visible особый JPanel или JComponent используйте метод setVisible()
2 голосов
/ 18 января 2012

Используйте, например, вертикальный BoxLayout вместо GridLayout

1 голос
/ 18 января 2012

Вы должны использовать другой макет.GridLayout рисует компоненты в максимально возможном размере.

...