2016-12-11 3 views
1

Я пытаюсь получить компонент BasicArrowButton для изменения размера и не могу заставить его работать на всю жизнь. Следующий код является гораздо более простой версией проблемы, но все же демонстрирует то, что я пытаюсь сделать. Кнопка находится в JPanel с макетом панели, установленным в FlowLayout. Он должен изменить размер, оставаясь на панели с одинаковой компоновкой. Заранее спасибо, и извините за плохое форматирование:Изменение размера BasicArrowButton

Основной класс:

package PackageMain; 

import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.WindowConstants; 

public class Main { 

public static JFrame frame = new JFrame("Window"); 
public static PanelOne p1; 
public static PanelTwo p2; 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
       frame.setBounds(100, 100, 800, 600); 
       p1 = new PanelOne(); 
       frame.setVisible(true); 
      } catch(Exception e){ 

      } 
     } 
    }); 
} 
} 

Второй класс:

package PackageMain; 

import java.awt.Dimension; 
import java.awt.FlowLayout; 

import javax.swing.JPanel; 
import javax.swing.plaf.basic.BasicArrowButton; 

public class PanelOne{ 

public PanelOne(){ 
    FlowLayout fl = new FlowLayout(); 
    BasicArrowButton b1 = new BasicArrowButton(BasicArrowButton.WEST); 
    JPanel p1 = new JPanel(); 
    p1.add(b1); 
    p1.setLayout(fl); 
    b1.setPreferredSize(new Dimension(100, 100)); //DOESN'T WORK! 
    Main.frame.add(p1); 

} 
} 

ответ

2

Проблема заключается в том, что класс BasicArrowButton переопределяет метод GetPreferredSize(). Таким образом, вам нужно либо использовать макет, который не соблюдает этот метод, либо предоставить вашу собственную реализацию для этого метода.

Первое предложение:

import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 
import javax.swing.plaf.basic.BasicArrowButton; 

public class BasicArrowButtonTest { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frm = new JFrame("Test arrow button"); 
       JPanel p = new JPanel(new GridLayout(1, 1)); 
       p.setPreferredSize(new Dimension(100, 100)); 
       p.add(new BasicArrowButton(BasicArrowButton.WEST)); 
       frm.add(p); 
       frm.pack(); 
       frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
       frm.setLocationRelativeTo(null); 
       frm.setVisible(true); 
      } 
     }); 
    } 
} 

Второе предложение:

package org.swingsamples.label; 

import java.awt.Dimension; 
import java.awt.FlowLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 
import javax.swing.plaf.basic.BasicArrowButton; 

public class BasicArrowButtonTest { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frm = new JFrame("Test arrow button"); 
       JPanel p = new JPanel(new FlowLayout()); 
       BasicArrowButton btn = new BasicArrowButton(BasicArrowButton.WEST) { 
        @Override 
        public Dimension getPreferredSize() { 
         return new Dimension(100, 100); 
        } 
       }; 
       p.add(btn); 
       frm.add(p); 
       frm.pack(); 
       frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
       frm.setLocationRelativeTo(null); 
       frm.setVisible(true); 
      } 
     }); 
    } 
}