2014-11-27 7 views
0
  1. Привет я следующие классы, я хочу отображать содержимое (paintComponentor эту панель с этого прямоугольника из класса краски) внутри моей JFrame. Я пытаюсь уже узнать, как это сделать: глядя на разные примеры, размещенные на этом форуме, однако это не помогает мне. Мне нужен простой пример, например, панель внутри рамки с компонентом краски или чем-то подобным, чтобы понять, как это должно работать! пс. не вешай меня на дерево, потому что я новичок, задаю вопрос !!!JFrame, JPanel, paintComponent как

    [Я хочу что-то вроде этого] [1]

    package scp; 
    
    import java.awt.*; 
    
    import javax.swing.*; 
    
    public class Panel extends JPanel { 
        public Panel() { 
         //this.setPreferredSize(new Dimension(200,200)); 
         //panel = new Panel(); 
         setVisible(true); 
         setLayout(new FlowLayout()); 
         setSize(200, 300); 
         getRootPane(); 
        } 
        @Override 
        public void paintComponent(Graphics g){ 
         g.drawString("HEY",20,20); 
         g.drawRect(200, 200, 200, 200); 
        } 
    
    } 
    
    and 
    
    package scp; 
    
    import javax.swing.JFrame; 
    import javax.swing.JButton; 
    
    import java.awt.Color; 
    import java.awt.FlowLayout; 
    import java.awt.event.ActionListener; 
    import java.awt.event.ActionEvent; 
    import java.beans.EventHandler; 
    
    public class Frame extends JFrame { 
    
        JButton redButton; 
        JButton blueButton; 
    
        public Frame() 
        { 
         super("EventHandling"); 
         setLayout(new FlowLayout()); 
         redButton = new JButton("Red"); 
         add(redButton); 
         blueButton = new JButton("Blue"); 
         add(blueButton); 
    
         EventHandler h = new EventHandler(); 
    
         redButton.addActionListener(h); 
         blueButton.addActionListener(h); 
    
        } 
    
        private class EventHandler implements ActionListener 
        { 
         public void actionPerformed(ActionEvent e) 
         { 
          if (e.getSource()==redButton) 
           getContentPane().setBackground(Color.RED); 
          else if(e.getSource()==blueButton) 
           getContentPane().setBackground(Color.BLUE); 
         } 
        } 
    
    } 
    
    and 
    
    package scp; 
    
    import javax.swing.JFrame; 
    
    public class EventHandling { 
    
        public static void main(String[] args) { 
    
         Frame f = new Frame(); 
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         f.setSize(800,600); 
         f.setVisible(true); 
         f.getContentPane().add(new Panel()); 
        } 
    
    } 
    

    [1]: http://i.stack.imgur.com/OJTrq.png

ответ

4

Начните с взглянуть на:

Это, вероятно, самый простой я могу это сделать ...

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JFrame; 
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(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
     } 

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

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      int width = getWidth() - 100; 
      int height = getHeight() - 100; 
      int x = (getWidth() - width)/2; 
      int y = (getHeight() - height)/2; 
      g2d.setColor(Color.RED); 
      g2d.drawRect(x, y, width, height); 
      g2d.dispose(); 
     } 

    } 

} 

Соединение Пример

В данном примере используется outer панель, которая имеет приложенная к нему пустая граница, это подталкивает содержимое краев outer panel.

Внутренняя панель (которая не изменилась с последнего примера), поскольку к ней прикреплена светло-серая рамка, поэтому вы можете ее увидеть, красный прямоугольник все еще окрашен панелями paintComponent.

Compound

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 javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.LineBorder; 

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 outer = new JPanel(new BorderLayout()) { 
        @Override 
        public Dimension getPreferredSize() { 
         return new Dimension(400, 400); 
        } 
       }; 

       outer.setBorder(new EmptyBorder(50, 50, 50, 50)); 

       TestPane tp = new TestPane(); 
       tp.setBorder(new LineBorder(Color.LIGHT_GRAY)); 

       outter.add(tp); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(outer); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 

     } 

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

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      int width = getWidth() - 100; 
      int height = getHeight() - 100; 
      int x = (getWidth() - width)/2; 
      int y = (getHeight() - height)/2; 
      g2d.setColor(Color.RED); 
      g2d.drawRect(x, y, width, height); 
      g2d.dispose(); 
     } 

    } 

} 
+0

этот красный квадрат на самом деле печатается краской компонента справа? hmm, о чем, если этот красный прямоугольник будет панелью, которая держит привязку или изображение? –

+0

Красный квадрат окрашен в пределах панели, которая находится внутри рамки. В этом примере красный квадрат всегда на 100 пикселей меньше, чем панель объемного звучания. – MadProgrammer

+0

, поэтому, если я добавлю еще одну панель, которая, например, будет содержать текст, красный прямоугольник будет находиться в одной и той же позиции внутри панели, не будет ли там, где эта панель будет располагаться на макете? –

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