0
메인 레이지에 cardlayout을 사용했습니다. 그 카드 레이아웃에 첫 번째 패널을 추가했습니다. 첫 번째 패널에서 프레임의 이미지를 숨기려고합니다. 그래서자바에서 프레임 간 통신 제공 방법
내 주요 클래스, 내가 패널에서 프레임에 통신을 제공하는 인터페이스를 위해 사용하고
public class HomePage implements OptionMenuListener{
private static void createAndShowGUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Already there
frame.setUndecorated(true);
frame.setLocationRelativeTo(null);
JPanel contentPane = new JPanel();
contentPane.setLayout(new CardLayout(20, 20));
File file = new File(jsonFilePath);
if(!file.exists()) {
LoginPage login = new LoginPage();
contentPane.add(login, Constants.CARD_LOGIN);
ConfigueBranch configureBranch = new ConfigueBranch(false);
contentPane.add(configureBranch, Constants.CARD_CONFIGURE_BRANCH);
ConfigureSystem configureSystem = new ConfigureSystem(false);
contentPane.add(configureSystem, Constants.CARD_CONFIGURE_SYSTEM);
ConfigureCustomer configureCustomer = new ConfigureCustomer(false);
contentPane.add(configureCustomer, Constants.CARD_CONFIGURE_CUSTOMER);
}
MainPage mainPage = new MainPage(HomePage.this);
contentPane.add(mainPage, Constants.CARD_MAINPAGE);
// SettingsPage configureExpinContainer = new SettingsPage();
// contentPane.add(configureExpinContainer, Constants.CARD_SETTINGS_PAGE);
JPanel buttonPanel = new JPanel();
buttonPanel.setBorder(new EmptyBorder(50, 10, 10, 10));
Image image = MyUtil.loadImage("/logo.png"); // transform it
Image newimg = image.getScaledInstance(244, 80, java.awt.Image.SCALE_SMOOTH);
ImageIcon icon = new ImageIcon(newimg); // transform it back
JLabel label = new JLabel("", icon, JLabel.LEFT);
label.setFont(new java.awt.Font("Arial", Font.BOLD, 24));
label.setOpaque(true);
label.setForeground(Color.BLACK);
label.setBounds(0, 60, 300, 200);
buttonPanel.add(label);
frame.add(contentPane, BorderLayout.CENTER);
frame.add(buttonPanel, BorderLayout.PAGE_START);
frame.pack();
frame.setSize(1000, 700);
centeredFrame(frame);
frame.setVisible(true);
frame.setResizable(false);
}
public static void centeredFrame(javax.swing.JFrame objFrame) {
Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize();
int iCoordX = (objDimension.width - objFrame.getWidth())/2;
int iCoordY = (objDimension.height - objFrame.getHeight())/2;
objFrame.setLocation(iCoordX, iCoordY);
}
public static void main(String... args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
@Override
public void onMenuSelect(boolean isShow) {
}
}
,
public interface OptionMenuListener {
void onMenuSelect(boolean isShow);
}
내가 사용하고, 코드를 아래와 같이 인터페이스를 사용했다
공개 클래스 메인 페이지는 JPanel {
JButton inputOutputFilesBtn, syncBtn, tsBtn, settingsBtn;
public MainPage(HomePage homePage){
homePage.onMenuSelect(true);
init();
}
public void init(){
JTabbedPane jtbExample = new JTabbedPane();
JPanel jplInnerPanel1 = createInnerPanel("No device connected");
jtbExample.addTab("Input and Output Files", jplInnerPanel1);
jtbExample.setSelectedIndex(0);
JPanel jplInnerPanel2 = createInnerPanel("No device connected");
jtbExample.addTab("Sync", jplInnerPanel2);
JPanel jplInnerPanel3;
if(configuredSystem.equalsIgnoreCase("Expeditors")) {
jplInnerPanel3 = createInnerPanel("No device connected");
jtbExample.addTab("TS", jplInnerPanel3);
}
JPanel jplInnerPanel4 = new SettingsPage();
jtbExample.addTab("Settings", jplInnerPanel4);
JPanel jplInnerPanel5 = new LogoutPage();
jtbExample.addTab("Logout", jplInnerPanel5);
this.setLayout(new BorderLayout());
this.setPreferredSize(new Dimension(620, 400));
this.add(jtbExample, BorderLayout.CENTER);
add(jtbExample);
}
protected JPanel createInnerPanel(String text) {
JPanel jplPanel = new JPanel();
JLabel jlbDisplay = new JLabel(text);
jlbDisplay.setHorizontalAlignment(JLabel.CENTER);
jplPanel.setLayout(new GridLayout(1, 1));
jplPanel.add(jlbDisplay);
return jplPanel;
}
012 3,516,
하지만 난 지금 내가 cardlayout이 프레임에 패널에서 몇 가지 정보를 보낼
MainPage mainPage = new MainPage(HomePage.this);
라인
다음은이에 정적 컨텍스트 오류로 인해이를 사용할 수 없습니다 을 얻고있다. 이 아이디어를 나에게 제안 해 주시겠습니까? 미리 감사드립니다.
원하는 작업이 무엇 정적 컨텍스트 외부에서 그 논리를 이동해야? 'HomePage.this'는'static' 컨텍스트가 아닌 경우 인스턴스가됩니다. 여기, '이'는 존재하지 않는다. 인스턴스가 필요하면 HomePage의 생성자/메소드에 코드를 삽입하거나 단순히 인스턴스 HomePage hp = new HomePage()를 선언하고 인스턴스를 MainPage에 전달하십시오. 나를 위해,이 디자인 문제입니다, 정적 메서드에서 많은 GUI 초기화하지 마십시오. – AxelH
'createAndShowGUI' 메소드를 정적이 아닌 메소드로 만듭니다. 패널에서 프레임으로 몇 가지 정보를 보내려면 프레임에 메서드를 만들고 패널에서 호출하십시오. –
@JaySmith 응답 해 주셔서 감사합니다. public static void centeredFrame (javax.swing.JFrame objFrame) {} 메서드 – Olive