2013-01-11 34 views
2

我正在處理查詢數據庫並將該信息拖到已添加到JFrame的幾個JPanel上的應用程序。每隔30秒,我將一個人的可見性設置爲false,另一個人在JFrame中將其設置爲true,以替換顯示的人。Java JPanel不會出現在Linux中的JFrame中

該應用程序在Windows中運行得非常漂亮,但是當我將它放在我的Ubuntu機器上時(運行XFCE和openjdk-7-jre),面板不顯示出來。 JFrame中的其他組件確實出現,但我不確定發生了什麼問題。再次,程序在Windows中正確運行,但不是Ubuntu。

我試圖削減我的代碼,將自己編譯和運行的東西,但我知道我的代碼是一團糟。我幾乎沒有做過Java編程,所以我很抱歉所有這些都會變得醜陋!我也刪除了數據庫的東西,因爲這是工作,因此你不必看到。

感謝任何能指引我朝着正確方向的人!

package productivityDisplay; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class Display implements ActionListener { 

// Sizing constants 
public boolean trimNames = false; // if true, trims to 10 characters (use 
            // this if something is cut off) 
int refreshRate = 600000; // Refresh rate for Data (milliseconds) 
int margin = 2; 
int labelHeight = 76; 
Font defaultFont = new Font("Tahoma", Font.PLAIN, 50); 
Color DodgerBlue = new Color(30, 144, 255); 
Color OrangeRed = new Color(255, 69, 0); 
Color DarkGreen = new Color(0, 100, 0); 
// End Sizing constants 

// Controls 
private JLabel lblCountDown; 
public int countDown; 
private Timer refresh; 
private JFrame frame; 
private JLabel lblCurrTime; 
private JPanel pnlGrind1, pnlGrind2; 
private JLabel lblWeekSummary, lblRepairCredit, 
     lblRepair2Count, lblCustom1, lblCustom2, 
     lblQC, lblRepair, lblRepair2; 
@SuppressWarnings("rawtypes") 
private JComboBox cmbTeamNames; 
// End Controls 

// Data Variables 
private int currentTeam; 

// End Data Variables 

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Display window = new Display(1); // Attempts to show 
                // the 
                // window 
       window.frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       throw new Error("Yeah, it's broken."); 
      } 
     } 
    }); 
} 


public Display(int team) { 
    initialize(); 
    cmbTeamNames.setSelectedIndex(team); 
    getData(); 
} 

/** 
* @wbp.parser.entryPoint 
*/ 

@SuppressWarnings({ "unchecked", "rawtypes" }) 
private void initialize() { 
    frame = new JFrame(); 

    frame.setVisible(true); 
    frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH); // Maximize 
                       // Window 
    int width = frame.getWidth(); 
    int height = frame.getHeight(); 
    //frame.setResizable(true); // Can't be resized 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setLayout(null); 

// MASSIVE CHUNK OF LAYOUT CODE // 

    String[] strTeamNames = { "", "Grinding", "Finishing" }; 
    cmbTeamNames = new JComboBox(strTeamNames); // Combo Box (Grinding, 
               // finishing) 
    cmbTeamNames.setFont(new Font("Tahoma", Font.PLAIN, 40)); 
    cmbTeamNames.setBounds(20, 11, 297, 67); 
    frame.getContentPane().add(cmbTeamNames); 
    cmbTeamNames.setName("cmbTeamNames"); 
    cmbTeamNames.addActionListener(this); 

    lblCurrTime = new JLabel("Clock"); 
    lblCurrTime.setFont(new Font("Tahoma", Font.PLAIN, 99)); 
    lblCurrTime.setBounds((width - 350), 11, 300, 100); 
    frame.getContentPane().add(lblCurrTime); 
    countDown = 0; 
    lblCountDown = new JLabel("Next update in: "+countDown); 
    lblCountDown.setFont(new Font("Tahoma", Font.PLAIN, 40)); 
    lblCountDown.setBounds(cmbTeamNames.getX() + cmbTeamNames.getWidth() 
      + 40, 20, 400, 50); 
    frame.getContentPane().add(lblCountDown); 

    // Grinding Layout 2 

    pnlGrind2 = new JPanel(); 
    pnlGrind2.setBounds(20, 89, (width - 50), height - 130); 
    frame.getContentPane().add(pnlGrind2); 
    pnlGrind2.setLayout(null); 
    pnlGrind2.setBorder(BorderFactory.createLineBorder (Color.blue, 2)); 
    // Column1 

    JSeparator separator = new JSeparator(); 
    separator.setBounds(0, (labelHeight + margin - 1), 300, 10); 
    pnlGrind2.add(separator); 
    // End Column1 
    // Column2 
    int leftSet = 450; 

    JSeparator separator2 = new JSeparator(); 
    separator2.setBounds(leftSet, (labelHeight + margin - 1), 200, 10); 
    pnlGrind2.add(separator2); 

    // End Column2 
    // Column3 
    leftSet = 750; 

    JSeparator separator3 = new JSeparator(); 
    separator3.setBounds(leftSet, (labelHeight + margin - 1), 200, 10); 
    pnlGrind2.add(separator3); 

    // End Column3 
    // Bottom rows 

    lblRepair2 = new JLabel("Repair Credit:"); 

    pnlGrind2.add(lblRepair2); 
    lblRepair2.setFont(defaultFont); 
    lblRepair2.setForeground(DodgerBlue); 
    lblRepair2Count = new JLabel(""); 
    lblRepair2Count.setBounds(lblRepair2.getX() + lblRepair2.getWidth() 
      + margin, lblRepair2.getY(), 515, labelHeight); 
    pnlGrind2.add(lblRepair2Count); 
    lblRepair2Count.setFont(defaultFont); 
    lblRepair2Count.setForeground(DodgerBlue); 

    // End Bottom rows 
    pnlGrind2.setVisible(false); 
    pnlGrind2.setBackground(new Color(0, 0, 204)); // Used to see panel 
    // better 

    // End Grinding Layout 2 

    // Grinding Layout 1 

    pnlGrind1 = new JPanel(); 
    pnlGrind1.setBounds(20, 89, (width - 50), height - 130); 
    frame.getContentPane().add(pnlGrind1); 
    pnlGrind1.setLayout(null); 
    pnlGrind1.setBorder(BorderFactory.createLineBorder (Color.blue, 2)); 
    pnlGrind1.setVisible(false); 
    pnlGrind1.setBackground(new Color(255, 0, 204)); // Used to see panel 
    // better 

    // Left Side 
    lblWeekSummary = new JLabel("Week Summary (Measured at Buffing)"); 
    lblWeekSummary.setBounds(0, 0, 515, 37); 
    pnlGrind1.add(lblWeekSummary); 
    lblWeekSummary.setFont(new Font("Tahoma", Font.PLAIN, 30)); 
    // Spacing 
    lblCustom1 = new JLabel("Custom:"); 
    lblCustom1.setBounds(0, 
      lblWeekSummary.getY() + (lblWeekSummary.getHeight() + margin) 
        * 2, 515, labelHeight); 
    pnlGrind1.add(lblCustom1); 
    lblCustom1.setFont(defaultFont); 
    lblCustom1.setForeground(OrangeRed); 

    lblRepairCredit = new JLabel("Repair Credit:"); 
    lblRepairCredit.setBounds(0, 
      lblCustom1.getY() + (lblCustom1.getHeight() + margin), 515, 
      labelHeight); 
    pnlGrind1.add(lblRepairCredit); 
    lblRepairCredit.setFont(defaultFont); 
    lblRepairCredit.setForeground(DodgerBlue); 
    // Spacing 
    lblQC = new JLabel("QC"); 
    lblQC.setBounds(
      0, 
      (int) (lblRepairCredit.getY() + (lblRepairCredit.getHeight() + margin) * 1.5), 
      515, labelHeight); 
    pnlGrind1.add(lblQC); 
    lblQC.setFont(defaultFont); 
    lblQC.setForeground(DarkGreen); 

    lblCustom2 = new JLabel("Custom:"); 
    lblCustom2.setBounds(0, lblQC.getY() + (lblQC.getHeight() + margin), 
      515, labelHeight); 
    pnlGrind1.add(lblCustom2); 
    lblCustom2.setFont(defaultFont); 
    lblCustom2.setForeground(DarkGreen); 

    lblRepair = new JLabel("Repair:"); 
    lblRepair.setBounds(0, lblCustom2.getY() 
      + (lblCustom2.getHeight() + margin), 515, labelHeight); 
    pnlGrind1.add(lblRepair); 
    lblRepair.setFont(defaultFont); 
    lblRepair.setForeground(DarkGreen); 
    // End Left Side 

    // Right Side 


    // End Right Side 

    // End Grinding Layout 1 
// END MASSIVE CHUNK OF LAYOUT CODE // 
    frame.pack(); 
    frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH); // Maximize 
    // Window 
} 

// Thread classes 


public void getData() { 
    ActionListener updateData = new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      pnlGrind1.repaint(); 
      pnlGrind2.repaint(); 
      countDown = 15; 
     } 
    }; 
    refresh = new Timer(refreshRate, updateData); 
    refresh.start(); 

} 

// End Thread Classes 


public void actionPerformed(ActionEvent e) { // Combo box to select team was 
               // clicked 

    int team; 
    team = cmbTeamNames.getSelectedIndex(); 
    currentTeam = team; 
    countDown=600; 
    int t2Interval = 5000; 
    if (team == 1) { // Grinding team 
     pnlGrind1.setVisible(true); 
    } 
    ActionListener alternatePnl = new ActionListener() { 

     public void actionPerformed(ActionEvent evt) { 
      // updateData(); 

      alternatePanel(cmbTeamNames.getSelectedIndex()); 

     } 
    }; 
    new Timer(t2Interval, alternatePnl).start(); 

} 


void alternatePanel(int team) { 
    if (team == 1) { // If Grinding team 
     if (pnlGrind1.isVisible()) { 
      pnlGrind1.setVisible(false); 
      pnlGrind2.setVisible(true); 
     } else { 
      pnlGrind2.setVisible(false); 
      pnlGrind1.setVisible(true); 
     } 
    } 

} 

}

+6

第一個提示,現在@mKorbel已經吸引了我的注意力 - ***使用佈局。*** –

+1

1)不要使用'null' /'絕對'佈局。使用適當的[LayoutManager](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)並在「JFrame」上調用'pack()',然後將其設置爲可見。 2)不要在類上實現'ActionListener',除非它將用作其他類的監聽器,但我懷疑不要使用'DISPOSE_ON_CLOSE',除非是爲了某個目的,而是'EXIT_ON_CLOSE' –

+3

@AndrewThompson,好的,我會看看使用佈局。我一直使用絕對定位,因爲它只能在兩臺機器上運行,兩臺機器的窗口大小相同,所以佈局靈活性不在我的優先級列表中。 – snyderxc

回答

0

由於JPanels得到負的高度和寬度:

pnlGrind2.setBounds(20, 89, (width - 50), height - 130); 

,和寬度=高度= 0那裏。您剛剛初始化了JFrame,所以默認情況下均爲0,您立即將這些值分配給heightwidth

如果已經做絕對佈局,是一致的,並儘快指定的幀大小:

private void initialize() { 
    frame = new JFrame(); 
    frame.setSize(800, 600); 
    ... 

之後JPanels出現我的Ubuntu機器上的屏幕上。

+0

非常感謝!有沒有辦法獲得最大的窗口大小,並設置「寬度」和「高度」? – snyderxc

+0

您可以設置所需的任何值,這是您的框架在屏幕上的像素大小。您已經以像素爲單位指定了其他值,因此您應該瞭解這些尺寸。嘗試各種價值。如果你運行全屏,只需使用你的屏幕分辨率。此外,儘量不要調用pack(),它可能會更好的絕對大小和佈局。 – h22

+0

非常感謝@Audrius! – snyderxc