2016-07-10 4 views
0

스윙 GUI로 Java Desktop Application을 만들었습니다. 메뉴 막대에 "정보"항목이 있습니다. 이 "정보"메뉴 항목을 클릭하면 JDialog가 JOptionPane.showMessageDialog (...) 아이콘, 프로그램에 대한 텍스트, 대화 상자를 닫는 "OK"버튼으로 표시됩니다.배경에 Java JOptionPane 사용자 정의 draw

대화 상자의 배경을 돌아 다니며 색상을 변경하는 하나 이상의 볼 (원) 효과를 그립니다.

@Titus의 솔루션 업데이트 된 코드 :

사용자위한 JOptionPane 클래스 :

class MyEffectPane extends JOptionPane { 

    public MyEffectPane(String message, int type){ 
     super(message, type); 

     makeOpa(this); 
    } 

    // needed to make the drawings visible 
    void makeOpa(JComponent comp){ 
     for(Component c : comp.getComponents()){ 
      if(c instanceof JPanel){ 
       JPanel p = (JPanel)c; 
       p.setOpaque(false); 
       makeOpa(p); 
      } 
     } 
    } 


    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     int width = getWidth(); 
     int height = getHeight(); 

     g.setColor(Color.BLACK); 

     g.fillOval(width/2-50, height/2-50, 50, 50); 
    } 
} 

전화/쇼 대화 :

MyEffectPane pane = new MyEffectPane("message....", JOptionPane.INFORMATION_MESSAGE); 
    JDialog dialog = pane.createDialog(this, "About"); 
    //dialog.setIconImage(icon.getImage()); 
    dialog.setVisible(true); 
    dialog.dispose(); 
+1

'showMessageDialog' 메쏘드는'정적'입니다 (당신은 그것을 오버라이드 할 수 없습니다). 그리고 그것 자신의'JOptionPane' 객체를 만듭니다. – Titus

+0

@Titus 고맙습니다. 내 문제에 대한 해결책을 알고 계십니까? – trinity420

+1

디버깅 문에 대해서는'System.out.println()'을 사용하지 마십시오. 'System.out'은 버퍼링 된 스트림이기 때문에 반드시 실행될 때마다 라인을 출력하지는 않습니다. 대신 즉시 보장 된 출력을 위해'System.err.println()'을 사용하십시오. –

답변

3

showMessageDialog 방법은 static (당신이 할 수있다 그것을 무시하고) 자신의 JOptionPane 객체를 생성합니다.

당신 인의 showMessageDialog가 무엇을하고 있는지 재현 할 수 있습니다 :

/** 
* This method shows an INFORMATION_MESSAGE type message dialog. 
* 
* @param parentComponent The component to find a frame in. 
* @param message The message displayed. 
*/ 
public static void showMessageDialog(Component parentComponent, Object message){ 
    JOptionPane pane = new JOptionPane(message, INFORMATION_MESSAGE); 
    JDialog dialog = pane.createDialog(parentComponent, null); 
    dialog.show(); 
} 

그리고이 같은으로 변경할 수 있습니다 : 또한

MyEffectPane pane = new MyEffectPane("message....", JOptionPane.INFORMATION_MESSAGE); 
JDialog dialog = pane.createDialog(this, null); 
dialog.show(); 

, 당신은이 생성자를 추가해야합니다 당신의 MyEffectPane 클래스 :

MyEffectPane(String message, int type){ 
    super(message, type); 
} 
+0

고맙습니다 !!!! 이것은 완벽하게 작동합니다! JDialog의 컴포넌트가'setOpaque (false)'를 사용하여 drawin을 숨기지 않도록하기 위해 코드를 추가했다. 나는 작업 코드로 포스트를 업데이트 할 것이다. – trinity420

2

대화 상자의 배경을 돌아 다니며 색상을 변경하는 하나 이상의 볼 (원) 효과를 그립니다.

JOptionPane을 사용하지 마십시오.

대신 사용자 정의 JDialog을 만들 수 있습니다. 그런 다음 사용자 정의 페인팅을 수행하는 대화 상자에 JPanel을 추가합니다.

자세한 내용은 Custom Painting의 스윙 튜토리얼 섹션을 참조하십시오.

참고 : 사용자 지정 페인팅을 수행 할 때 paintComponent(..) 오버라이드는 페인트 (...)가 아닙니다.

또는 원하는 경우 JOptionPane에 사용자 정의 JPanel을 추가 할 수 있습니다. 어쨌든 핵심은 JPanel에서 사용자 정의 페인팅을 수행하는 것입니다.

+0

너무 감사하지만 @ 티투스의 방법이 완벽하게 작동합니다. 나는 이것을 시도했다. 그러나 문제는 당신이보기 좋게하기 위해 JDialog에서 당신의 텍스트, 아이콘 그리고 OK 버튼에 대한 조정을해야한다는 것이다. 패널 추가는 작동하지만 그릴 수있는 작은 영역 만 있으면 일반 JDialog의 텍스트가있는 영역입니다. – trinity420

1

JOptionPane을 재정의 할 수 없습니다. 정적이며 확인 옵션을 쉽게 만들 때 주로 사용됩니다.

원하는대로 JDialog를 사용할 수 있습니다. JDialog를 사용하면 사용자 정의 된 내용으로 팝업 창을 쉽게 만들 수 있습니다.

JOptionPane을 이미 사용하려고 했으므로 JOptionPane을 트리거하는 포함 패널이 있다고 가정합니다.

  1. 부모 패널에서 포함 된 창을 추출하려면 다음을 사용하십시오 : SwingUtilities.getWindowAncestor(panel)
  2. 추출 된 창을 사용하여 JDialog를 만듭니다. JDialog dialog = new JDialog(containerWindow)
  3. 원하는대로 JDialog 기능을 사용자 지정하십시오. 코드의

부분이 유사하게 나타납니다

Window containerWindow = SwingUtilities.getWindowAncestor(panel); 
JDialog dialog = new JDialog(containerWindow); 
dialog.setLayout(new BorderLayout()); 
dialog.setLocationRelativeTo(containerWindow); 
dialog.setResizeable(false); 
dialog.add(effectPanel, BorderLayout.CENTER); 

을이 경우 effectPanel은 당신이 원하는 그래픽과 모든 것을 가진 사용자 정의 패널입니다. 이 코드를 작성하는 가장 좋은 방법은 아니지만 나는 당신을 위해 예제로 작성하고 있습니다. 여기에서 JDialog가 할 수있는 것을 더 많이 볼 수 있습니다 : JDialog

+0

감사합니다! 이것은 매우 흥미롭게 보입니다! 결과 JDialog가 BorderLayout을 사용하므로 잘 보이지 않는 문제가 될 수 있다고 생각합니다. 예를 들어 OK 버튼은 하단에서 전체 너비 크기를 가져옵니다. 아니면 내가 잘못 생각하고 있니? 그러나 @Titus 메서드는 완벽하게 작동합니다 .. – trinity420

+1

예제로 BorderLayout 만 사용했습니다. 필요한 레이아웃을 사용할 수 있습니다. 더 쉬운 해결책을 발견한다면 그것은 대단합니다! 옵션 패널에해야 할 일이 조금 복잡해지면 JDialog가 더 유용 할 수 있습니다. – Migsarmiento

+0

당신이 맞습니다. 더 복잡해지면 해결책이 더 나을 것입니다. – trinity420

관련 문제