2015-02-07 9 views
1

JLabel 또는 GUI를 그릴 때 JFrame에 마지막으로 추가 한 것은 그려지고 나머지는 그려지거나 페인트되지 않습니다. 내 GUI와 함께 특정 장소에서 JLabel을 그리는 솔루션을 찾도록 도와 주시면 감사하겠습니다. 나는 레이아웃에 대해 듣고 그것을 어떻게 도울 수 있었는지, 그러나이 주제에 관해 다른 것을 말하는 많은 사람들이있었습니다. 여기 내 코드가있다.paintcomponent 메소드의 My JLabel과 GUI 코드가 동시에 그려지지 않습니다

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
import javax.swing.Timer; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 
import static java.lang.System.*; 
import java.awt.event.*; 
import java.awt.Graphics.*; 


public class Main extends JPanel 
{ 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    double w = screenSize.getWidth(); 
    double h = screenSize.getHeight(); 
    static JFrame f = new JFrame("Tic-Tac-Toe"); 
    static JPanel p = new JPanel(); 
    int width = (int)w; 
    int height = (int)h; 
    int width1a = width/2 - 300; 
    int width2a = width/2 - 100; 
    int width3a = width/2 + 100; 
    int width4a = width/2 + 300; 
    int height1from = (int)height - 100; 
    int height1to = (int)height - (int)(height/1.05); 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     JLabel l = new JLabel("Hello World !"); 
     f.add(l); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setStroke(new BasicStroke(10)); 
     g.setColor(Color.black); 
     g2.drawLine(width1a, height1from, width1a, height1to); 
     g2.drawLine(width2a, height1from, width2a, height1to); 
     g2.drawLine(width3a, height1from, width3a, height1to); 
     g2.drawLine(width4a, height1from, width4a, height1to); 
    } 
    public static void main(String[] args) 
    { 
     Main m = new Main(); 
     f.setSize(400,300); 
     f.setExtendedState(Frame.MAXIMIZED_BOTH); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true);  
     JLabel l = new JLabel("Hello World !");    
     f.add(p); 
     f.add(m); 
    } 
} 

불분명 한 부분이 있으면 알려주십시오. JLabel과 GUI 드로잉을 JFrame에 표시하기 만하면됩니다. 다시 할 일을 제안하고 시간 내 주셔서 감사합니다!

답변

3

페인트 방법 내에서 구성 요소에 구성 요소를 추가하지 마십시오. 페인트 방법 내에서 어떤 방식 으로든 구성 요소의 상태를 수정해서는 안됩니다. 그림은 그림을위한 것이고, 다른 것은 없습니다.

당신은 BorderLayout 내에서 같은 위치에 세 가지 구성 요소를 추가

는, 일반적으로, 마지막 구성 요소가 제대로 나오지 것이다 로 ... Painting in AWT and Swing와 그림은 스윙에서 작동하는 방법에 대한 자세한 내용은 Performing Custom Painting보기 BorderLayout

자세한 내용은 Laying Out Components Within a ContainerHow to Use BorderLayout을 참조하십시오.

또한, 당신은 이벤트 디스패치 스레드의 컨텍스트 내에서 UI를 생성하고 있는지 확인

회화는 또한 구성 요소에 대한 문맥됩니다 자세한 내용은 Initial Threads을 볼 수, 즉, 0x0가 그린되어 컴퍼넌트의 좌상 구석, 컴퍼넌트의 시각 범위를 넘은 paint는 간단하게는 없어집니다.

또한 일반적으로 static의 사용을 피해야합니다. 이는 일반적으로 디자인에 문제가 있음을 나타내는 좋은 징후이며 UI 내에서 지저분 해집니다. 당신이 정말 날 static의 악에 대해 whinge 듣고 싶은 경우에는, this answer

Example

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JPanel blue = new JPanel(); 
       blue.setBackground(Color.BLUE); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JLabel("Hello world"), BorderLayout.NORTH); 
       frame.add(new TestPane()); 
       frame.add(blue, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      add(new JLabel("Hello World")); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      // This could actually be achieved using a EmptyBorder and a LineBorder 
      // but this demonstrates the point... 
      g2d.setColor(Color.RED); 
      g2d.drawRect(10, 10, getWidth() - 20, getHeight() - 20); 
      g2d.dispose(); 
     } 

    } 

} 
+0

그냥 그릴과의 JLabel을 추가하는 데 필요한 시도 및 catch 문인가 체크 아웃? – Raheel138

+0

나는 개인적으로 깊은 착석을하고, 기본 룩앤필을 증오한다. 나는 시스템의 모양과 느낌을 선호한다. 이것은 내 개인적인 취향이다. 만약 당신이 룩앤필을 설정하고 싶지 않다면, 너는 할 필요가 없다. – MadProgrammer

+0

또한 TestPane의 레이아웃이 JLabel의 위치를 ​​어떻게 지정할 수 있는가? BorderLayout이 맞습니까? 컨테이너를 사용 하시겠습니까? – Raheel138