PDA

View Full Version : سوال: سوال در مورد GUI



Behnam.B
سه شنبه 17 اردیبهشت 1392, 23:43 عصر
سلام دوستان.
برنامه ای خواستم بنویسم که با کلیک روی دکمه start پنلی به فرم GridLayout که قبلا پرش کردیم رو نمایش بده. اما وقتی برنامه رو اجرا میکنیم، بعد از کلیک روی دکمه، پنل، اول طوری نمایش داده میشه که انگار layoutش null تنظیم شده!:متعجب: اما مثلا با تغییر سایز frame نمایش پنل درست خواهد شد!
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class App {

JFrame frame;
JPanel panel;
JButton startBtn;
JButton button1;
JButton button2;

public App() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setLayout(null);

panel = new JPanel();
panel.setSize(200, 200);
panel.setLocation(50, 50);
panel.setBackground(Color.red);
panel.setLayout(new GridLayout(1, 2));

button1 = new JButton("Button1");
button2 = new JButton("Button2");
panel.add(button1);
panel.add(button2);

startBtn = new JButton("Start");
startBtn.setSize(80, 30);
startBtn.setLocation(0, 0);
startBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.add(panel);
frame.repaint();
// frame.setVisible(true);
}
});
frame.add(startBtn);

frame.setVisible(true);
}
}
و main ش هم که:
public class Program {
public static void main(String[] args){
App app = new App();
}
}
این مشکل با گذاشتن خط 43 رفع شد، اما استفاده ازش به نظر نمیاد معقول باشه!
کسی میتونه دلیل این اتفاق و روش معمول حلش رو بگه؟

javaphantom
چهارشنبه 18 اردیبهشت 1392, 08:05 صبح
سلام دوستان.
برنامه ای خواستم بنویسم که با کلیک روی دکمه start پنلی به فرم GridLayout که قبلا پرش کردیم رو نمایش بده. اما وقتی برنامه رو اجرا میکنیم، بعد از کلیک روی دکمه، پنل، اول طوری نمایش داده میشه که انگار layoutش null تنظیم شده!:متعجب: اما مثلا با تغییر سایز frame نمایش پنل درست خواهد شد!
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class App {

JFrame frame;
JPanel panel;
JButton startBtn;
JButton button1;
JButton button2;

public App() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setLayout(null);

panel = new JPanel();
panel.setSize(200, 200);
panel.setLocation(50, 50);
panel.setBackground(Color.red);
panel.setLayout(new GridLayout(1, 2));

button1 = new JButton("Button1");
button2 = new JButton("Button2");
panel.add(button1);
panel.add(button2);

startBtn = new JButton("Start");
startBtn.setSize(80, 30);
startBtn.setLocation(0, 0);
startBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.add(panel);
frame.repaint();
// frame.setVisible(true);
}
});
frame.add(startBtn);

frame.setVisible(true);
}
}
و main ش هم که:
public class Program {
public static void main(String[] args){
App app = new App();
}
}
این مشکل با گذاشتن خط 43 رفع شد، اما استفاده ازش به نظر نمیاد معقول باشه!
کسی میتونه دلیل این اتفاق و روش معمول حلش رو بگه؟


frame.getContentPane().add(startBtn);

yegane8
پنج شنبه 19 اردیبهشت 1392, 16:32 عصر
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class App {

JFrame frame;
JPanel panel;
JButton startBtn;
JButton button1;
JButton button2;

public App() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setLayout(null);

startBtn = new JButton("Start");
startBtn.setSize(80, 30);
startBtn.setLocation(0, 0);
startBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {

createPanel();
}
});
frame.add(startBtn);

frame.setVisible(true);
}
public JPanel createPanel(){

panel = new JPanel();
panel.setSize(200, 200);
panel.setLocation(50, 50);
panel.setBackground(Color.red);
panel.setLayout(new GridLayout(1, 2));
button1 = new JButton("Button1");
button2 = new JButton("Button2");

panel.add(button1);
panel.add(button2);
frame.add(panel);

frame.repaint();
frame.setContentPane(panel);
return panel;

}
public static void main(String[] args){
App app = new App();
}
}

Behnam.B
پنج شنبه 19 اردیبهشت 1392, 19:52 عصر
خیلی ممنون از راهنمایی تون، میشه یه توضیحی در مورد ContentPane بدین؟