2012-01-18 1 views
3

У меня есть панель (с GridLayout (0,1)), встроенная в JFrame.Как ограничить JButton, чтобы изменить его размеры в результате переоценки

По моему требованию: -

  • Я добавляю (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; 
    } 
} 

Спасибо, Rīts :)

+0

+1 Я когда-то использовал свой аватар как мой фон рабочего стола. : D – mre

ответ

2

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

+0

поиск в сети для "java vertical BoxLayout пример ", и voilla ..., он работал как прелесть. принимая ваш ответ ... :) – mogli

1

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

+0

любые предложения или код с примерами ... – mogli

+1

@rits Начать здесь: http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html –

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

Thnks для ваших входов. Я пробовал этот подход, но setVisible (false) оставляет пустое пространство, что не является моим требованием.В соответствии с требованием это пустое пространство должно использоваться другими textAreas. – mogli

+0

+1 Рассмотрим также 'JToolBar' (вместо' JPanel' с 'FlowLayout') для' JButton' в 'NORTH' ограничение. –

+0

@Andrew: jtoolbar.add (btn, JToolBar.NORTH) выбрасывает нелегальную позицию компонента. jtoolbar.add (btn) отлично работает, но отображает [JButton, JTextArea] в левом правом положении. – mogli

Смежные вопросы