2014-02-01 4 views
0

Чтобы сделать длинный рассказ коротким, у меня есть два объекта JPanel в моем JFrame, одна из них - панель настройки, а другая - графическая панель. Когда я изменяю размер окна, графические панели не изменяют размер соответственно.Изменить размер JPanel после установки цвета

У меня есть два класса, один из них GUImodel класса, а другой является ModelSim (имитационная модель) класс, в котором GUImodel класс визуализировать части моделирования в ModelSim.

Где i, j индексы в методе рисования (770,460) пикселей в моей картинке JPanel. fillRect цвет каждого пикселя 770x460 пикселей на основе моего определения в приведенном выше коде. Как изменить размер изображения JPanel, расширив окно. По логике, изменив размер графической панели, цветные пиксели больше не будут иметь квадратную форму, что в моем случае прекрасное.

Пожалуйста, помогите мне, как я могу это сделать? Дайте мне знать, если вам нужна любая другая информация


Вот работоспособной код; первый класс - GUICA, а другой - ModelSim.

GUICA:

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ComponentEvent; 
import java.awt.event.ComponentListener; 

import javax.swing.*; 

/** 
* Cellular Automata Graphical User Interface 
* @author Mahdi 
* @version 1.0 
*/ 
// This code provide a simple GUI for Cellular Automata 
// Notice that we are going to extend our super class JFrame which is the main window of our simulation 
// Inside this JFrame, we are going to add two subframes, which are called JPanels. 
public class GUICA extends JFrame { 

    // We need to make to Jpanels inside the main Jframe 

    // First Jpanel is adjustPanel 
    private JPanel adjustPanel; 
    // Second Jpanel is graphicPanel 
    private JPanel graphicPanel; 

    // Now it is the time to create buttons 
    private JButton startButton; 
    private JButton resetButton; 
    private JButton stopButton; 

    // We need to make an object from our model to implement that one in GUI part 
    private ModelSim model; 

    // We need also timer to re-implement (update) our simulation 
    private Timer timer; 

    // Detrmining the initial values of Windows panel main size 
    static int widthPixel = 766; 
    static int heightPixel = 468; 
    Rectangle bounds; 
    // Now, that's the time to create our constructor 
    public GUICA(){ 
     // Here super is our JFrame and the string defines the name of our Frame. 
     super("Cellular Automata Evacuation"); 
     // The below code will close the window(JFrame), once we have click on window exit 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //lets define the default size of our window page(main JFrame), where the first value is the x and second one is y; 
     setSize(widthPixel,heightPixel); 


     // First let's define the role of our timer in our future simulation. We first have to initialize our object in 
     // the constructor, then with an actionlistener, we will define the role of timerlistener with a nested class. 
     timer = new Timer(1,new TimerListener()); 

     // We need to initialize our buttons right now. 
     // The important factor here is the actionlistener, we need to addactionlistener to each button to define their duties. 
     // Their duties can be defined by a nested class (which is defined inside our main class) 
     startButton = new JButton("Start"); 
     startButton.addActionListener(new StartListener()); 

     resetButton = new JButton("Reset"); 
     resetButton.addActionListener(new ResetListener()); 

     stopButton = new JButton("Stop"); 
     stopButton.addActionListener(new StopListener()); 

     // There are many options to put the buttons in different part of the JPanel, I am going to use not the easiest one 
     // but the handiest one. We want to accommodate our buttons inside adjustPanel 
     adjustPanel = new JPanel(new GridBagLayout()); 
     // The below code is for determining the position of our buttons 
     GridBagConstraints grid = new GridBagConstraints(); 

     grid.insets = new Insets(10,10,10,10); 
     // For start button 
     grid.gridx = 0; 
     grid.gridy = 1; 
     adjustPanel.add(startButton, grid); 
     // For stop button 
     grid.gridx = 0; 
     grid.gridy = 2; 
     adjustPanel.add(resetButton,grid); 
     //Let's Separate the buttons from each other with the below tricky method 
     grid.insets = new Insets(20,20,20,20); 
     JLabel white = new JLabel(); 
     grid.gridx = 0; 
     grid.gridy = 3; 
     adjustPanel.add(white,grid); 
     // For stop button 
     grid.gridx = 0; 
     grid.gridy = 4; 
     adjustPanel.add(stopButton,grid); 

     // We can determine that how much of the space is going to be belonged to adjustPanel 
     adjustPanel.setPreferredSize(new Dimension(100,heightPixel)); 
     // We need to add this panel to our main JFrame panel; also we can determine where we want to place this panel 
     // I won't use grid method to place this panel. However,instead, I use the simplest way to determine the position of panels 
     setLayout(new BorderLayout()); 
     add(adjustPanel,BorderLayout.WEST); 

     // What about the other panel (graphicPanel) we need to initialize again, but we do not need to determine the exact position 
     // of this panle, because it will cover the whole remainder JFrame as its own property 
     graphicPanel = new JPanel(); 
     graphicPanel = new GraphicPanel(); 
     graphicPanel.setPreferredSize(new Dimension(widthPixel-100,heightPixel)); 
     //graphicPanel.setBackground(Color.white); 
     add(graphicPanel,BorderLayout.CENTER); 
     bounds = new Rectangle(widthPixel-100,heightPixel); 
     model = new ModelSim(bounds); 
    } 
    // Start button action listener 
    private class StartListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e) { 
      timer.start(); 

     } 
    } 

    // Reset button action listener 
    private class ResetListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e) { 
      model = new ModelSim(bounds); 

     } 
    } 

    // Stop button action listener 
    private class StopListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e) { 
      timer.stop(); 

     } 
    } 
    // Stop button action listener 
    private class TimerListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e) { 

      model.update(); 

     } 
    } 

    private class GraphicPanel extends JPanel{ 
     public GraphicPanel(){ 
      setPreferredSize(new Dimension(widthPixel-100,heightPixel)); 
      //super.revalidate(); 
      //super.repaint(); 
      //System.out.println(widthPixel); 
     } 
     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.setColor(Color.WHITE); 
      g.fillRect(0, 0, widthPixel-100,heightPixel); 
      model.draw(g); 

     } 

    } 

    // To make the code runnable, we need provide static main class 
    public static void main(String[] args){ 
     JFrame gui = new GUICA(); 
     gui.pack(); 
     gui.setVisible(true); 


    } 
} 

код ModelSim:

import java.awt.*; 
import java.util.ArrayList; 

public class ModelSim { 
    private Rectangle bounds; 
    private Color color; 

    public ModelSim(Rectangle bounds){ 
     // Properties 
     this.bounds = bounds; 
    } 

    public void update(){ 

    } 
     // Defining the static values together with walls and prohibited places. 
    public void draw(Graphics g){ 
     // Pixel Grow 
     int pgw = 1; 
     int pgh = 1; 
     for(int j = 0; j < bounds.getHeight(); j++){ 
      for(int i = 0; i < bounds.getWidth(); i++){ 
       if (i<100){ 
        g.setColor(color.RED); 
        g.fillRect(i,j,pgw,pgh); 

       }else if(i>100){ 
        g.setColor(color.GREEN); 
        g.fillRect(i,j,pgw,pgh); 
       }`enter code here` 
      } 
     } 
    } 
} 
+0

Для получения более полной помощи, отправьте [Минимальный полный испытанный и читаемый пример] (http://stackoverflow.com/help/mcve) (MCTRE). –

ответ

1

Edit:

Я полагаю, ваша панель изменении размеров, но вы не можете видеть это, как вы имеют жесткую кодировку фона. Чтобы избежать этого, я предлагаю вам использовать что-то вроде

g.fillRect(0, 0, this.getWidth(), this.getHeight()); 

Кроме того, литые Графика объект г до Graphics2D класса. Затем вы можете использовать метод масштабирования. Масштабирующие коэффициенты удваиваются и раздельны для осей x и y.

В вашем случае, коэффициенты масштабирования должны быть

double scaleX = this.getWidth()/770.0; 
double scaleY = this.getHeight()/460.0; 

// Now simply call scale 
((Graphics2D) g).scale(scaleX, scaleY); 

Поместите это перед нанесением ничего.

Надеюсь, это поможет.


Для размещения панелей в вашем JFrame необходимо использовать соответствующий менеджер макетов.

Если у вас есть только две панели, я бы предложил использовать BorderLayout. Он прост в использовании и, вероятно, будет служить вашей цели.

Таким образом ваши панели будут изменять размер при изменении размера окна.

Удачи.

+0

На самом деле, я использую BorderLayout, но это не изменяет размер моей графической панели; Я думаю, причина в том, что я уже определил, что определенный пиксель должен иметь определенный цвет. – Mahdi

+0

Отредактировав ответ, проверьте, работает ли он сейчас. –

+0

@ user3208567 Затем, после того, как вы завершили запуск, который демонстрирует вашу проблему, мы ничего не можем сделать ... – MadProgrammer

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