2013-03-19 3 views
3

JButton과 같은 Swing 구성 요소를 JPanel에 추가하면 'preferred size'로 렌더링됩니다.Swing 구성 요소의 페인트 크기를 얻는 방법은 무엇입니까?

그러나 바람직한 크기는 실제로 채색 된 단추보다 큽니다. 주변에는 보이지 않는 경계가있는 것처럼 보입니다. 내가 빨간색 인 btn1의 "PREFERREDSIZE을"그린

public class TestPanel extends JPanel { 

    JButton btn1 = new JButton("Test1"); 
    JButton btn2 = new JButton("Test2"); 

    public TestPanel() { 
     this.add(btn1); 
     this.add(btn2); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 

     g.setColor(Color.RED); 
     Dimension dim = btn1.getPreferredSize(); 
     g.drawRect(btn1.getX(), btn1.getY(), (int)(dim.getWidth()), (int)(dim.getHeight())); 
    } 

} 

사항은 preferredSize가 실제로 입증하기 위해 ...

JFrame frame = new JFrame(); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

TestPanel pnl = new TestPanel(); 
frame.getContentPane().add(pnl); 

frame.pack(); 
frame.setVisible(true); 

여기 내 테스트 패널입니다 : 여기

내 테스트 패널 간단한 프레임입니다 버튼 자체보다 큽니다.

enter image description here

내 질문은 어떻게 그려진 버튼이 아닌하는 JButton의 preferredSize가의 폭과 높이를 결정할 수있다?

도움을 주시면 감사하겠습니다.

UPDATE

실제로 모든 스윙 구성 요소에 대한 작업이 필요하기 때문에, 여기에 더 많은 구성 요소와 스크린 샷입니다.

표시 할 위젯의 "실제"크기가 내 응용 프로그램에 중요하다는 것을 결정해야합니다.

enter image description here

+0

나는 믿는다 (I 확실 상점 아니에요) 즉'JButton'의 구현의 일부 getbounds()를 사용

그래서 "숨겨진"것입니다 (여분의 경계가 아마도 코드를 읽는 계산 방법을 확인할 수 있습니다). 어쨌든, 그 가치는 무엇을 필요로합니까? 같은 것을 달성하는 또 다른 방법이있을 수 있습니다. – asermax

+0

@asermax JButton (또는 Swing 위젯/JComponent)을 창의 왼쪽이나 오른쪽 위나 아래에서 정확하게 10 픽셀 위치 시키려면 어떻게해야할까요? 현재 JButton은 가장자리에서 보이지 않는 테두리 인 10 픽셀입니다. 프로그래밍 방식으로 보이지 않는 부분의 너비/높이를 결정하는 방법이 있어야합니까? –

+0

내가 할 수있는 유일한 방법은 ['setBorderPainted'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html#setBorderPainted (boolean))를 사용하여 보이지 않는 테두리가 실제로는 테두리이며 구성 요소 자체에 의해 그려지지 않은 경우에는 채워지는 테두리입니다. 이전의 가정이 맞다면, 아마도'JComponent'의 ['getBorder'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#getBorder()) 너에게 국경을 줄 수 있고 너는 그것의 두께를 얻기 위해 너를 사용할 수있다. – asermax

답변

4

나는이 특정 또는 실질적으로 달성 할 수 있다고 생각하지 않습니다.

문제는 단추가 포커스 강조와 같이 다른 요소를 칠하기 위해 "도색되지 않은"영역을 사용하고 있다는 것입니다.

당신은 더 나은 아무것도 함께 온다 경우 AbstractButton#set/getMargin

+0

제안 해 주셔서 감사 합니다만 btn1.getMargin()이 나타납니다. '[top = 0, left = 2, bottom = 0, right = 2]'- 모든 추가 공간을 고려하지 않습니다. : –

+0

하루가 끝날 때 '도색되지 않은'영역은 Mac OS X에서 구성 요소의 일부로 구성됩니다. Windows에서 예상되는 동작을 볼 수 있습니다. 누구든 대상 플랫폼에서 위젯을 구현 한 사람 누구입니까? Tahnks for help . –

+0

그게 내가 생각했던 것입니다. 필자는 텍스트 필드와 구성 요소 테두리와 비슷한 문제를 겪었습니다 : P – MadProgrammer

4

볼 시도 할 수는 저자는 "당신이 JPanel에서 구성 요소를 넣을 것을 권장하고 JPanelborder을 설정합니다."참고

부록 : 아래의 의견을 바탕으로 귀하의 질문은 테두리를 렌더링하는 것이 아니라 구성 요소의 경계를 설정하는 것이 분명합니다. 사용하지 않는 공간으로 인식하는 것은 실제로 UI delegate가 여러 가지 용도로 예약합니다 (예 : 선택 강조 또는 미적 일관성. 예제 herehere에서 다른 Look & 느낌 테마를 선택하여 이것이 어떻게 다른지에 대한 아이디어를 얻을 수 있습니다.setBorder() 사용

image

:

image

import component.Laf; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

/** 
* @see https://stackoverflow.com/a/15490187/230513 
*/ 
public class Test { 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLayout(new FlowLayout()); 
     // https://stackoverflow.com/a/11949899/230513 
     f.add(Laf.createToolBar(f)); 
     f.add(decorate(new JButton("Test"))); 
     f.add(decorate(new JTextField("Test"))); 
     f.add(decorate(new JTextArea(3, 8))); 
     f.add(decorate(new JCheckBox("Test"))); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private JPanel decorate(final JComponent c) { 
     JPanel p = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       Rectangle r = c.getBounds(); 
       g.setColor(Color.red); 
       // NB pen hangs down and to the right 
       g.drawRect(r.x - 1, r.y - 1, r.width + 1, r.height + 1); 
      } 
     }; 
     p.add(c); 
     return p; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test().display(); 
      } 
     }); 
    } 
} 
+0

감사합니다.하지만 TestPanel에 빨간색 선을 그렸습니다. 위젯의 "preferredSize"의 범위입니다. 내가 결정하려고하는 것은 버튼 (또는 다른 위젯)의 채색 된 영역의 크기를 얻는 방법입니다. getPreferredSize가 될 것이라고 생각했지만 실제로는 더 커졌습니다. –

+0

목표를 명확히하기 위해 질문을 편집하는 데 도움이되며, L & F 장식을 방해하지 않는 다른 표시가 가능할 수도 있습니다. – trashgod

+0

도움을 주셔서 감사합니다. 그러나 질문은 꽤 명확하게 읽습니다. ''제 질문은, JButton의 preferredSize가 아닌, 페인트 된 버튼의 x, y, 너비, 높이를 어떻게 결정할 수 있느냐입니다. ""더 이상의 제안이 있다면, 나는 모두 귀입니다! 감사. –