如何在JPanel中的特定位置绘制垂直线?

时间:2013-02-01 15:13:53

标签: java swing jpanel paintcomponent japplet

我正在尝试使用JPanel为此媒体播放应用程序设计时间轴。为了提供关于时间线的当前视频帧的指示,我需要能够在TimeLinePanel类中扩展JPanel的特定x坐标处绘制垂直线。到目前为止,我没有太多运气使用paint()函数或覆盖paintComponent()。当我尝试在我的NewJApplet(此类扩展JApplet)类中使用paint()函数时,绘制了垂直线,但我使用的JPanel作为时间轴消失(边框不再可见)。另外,我听说使用paint()方法不是优选的。因此,我尝试覆盖paintComponent()中的JPanel方法,我尝试从NewJApplet调用paintComponent方法,但它不会使用timeLinePanel1更新/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package helloworld; import java.awt.GridLayout; import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * * @author Justin */ public class NewJApplet extends javax.swing.JApplet { /** * Initializes the applet NewJApplet */ @Override public void init() { /* Set the Nimbus look and feel */ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { /* for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } * */ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(NewJApplet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(NewJApplet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(NewJApplet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(NewJApplet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } //</editor-fold> /* Create and display the applet */ try { java.awt.EventQueue.invokeAndWait(new Runnable() { public void run() { initComponents(); timeLinePanel1.paintComponent(timeLinePanel1.getGraphics()); timeLinePanel1.repaint(); } }); } catch (Exception ex) { ex.printStackTrace(); } } /** * This method is called from within the init() method to initialize the * form. WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { myPanel = new javax.swing.JPanel(); timeLinePanel1 = new helloworld.TimeLinePanel(); myPanel.setBackground(new java.awt.Color(51, 51, 51)); javax.swing.GroupLayout myPanelLayout = new javax.swing.GroupLayout(myPanel); myPanel.setLayout(myPanelLayout); myPanelLayout.setHorizontalGroup( myPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(myPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(timeLinePanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 600, Short.MAX_VALUE) .addContainerGap()) ); myPanelLayout.setVerticalGroup( myPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, myPanelLayout.createSequentialGroup() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(timeLinePanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(myPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGap(0, 0, 0)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(myPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) ); }// </editor-fold> // Variables declaration - do not modify private javax.swing.JPanel myPanel; private helloworld.TimeLinePanel timeLinePanel1; // End of variables declaration } /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package helloworld; import java.awt.GridLayout; import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * * @author Justin */ public class TimeLinePanel extends javax.swing.JPanel { /** * Creates new form TimeLinePanel */ public TimeLinePanel() { initComponents(); } @Override protected void paintComponent(Graphics g) { Rectangle r = new Rectangle(3, 0, 1, 25); g.fillRect(25, 0, 1, 25); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jPanel1 = new javax.swing.JPanel(); jPanel1.setBackground(new java.awt.Color(255, 255, 255)); jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 200, Short.MAX_VALUE) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 25, Short.MAX_VALUE) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); }// </editor-fold> // Variables declaration - do not modify private javax.swing.JPanel jPanel1; // End of variables declaration } 垂直线。

任何帮助都将不胜感激。

以下是我到目前为止的代码:

timeLinePanel1

这是我尝试运行applet时得到的结果。理想情况下,我想在白框({{1}})中的某些(x,y)坐标处绘制一条垂直线,例如(25,0)(如代码中所示)以获得理解如何在JPanel中绘制垂直线。

enter image description here

2 个答案:

答案 0 :(得分:1)

您需要调用super.paintComponent才能绘制面板中的所有内容:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.fillRect(25, 0, 1, 25);
}

答案 1 :(得分:0)

我不确定,这是正确的答案,但可能你忘了设置颜色?

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.red);
    Rectangle r = new Rectangle(3, 0, 1, 25);
    g.fillRect(25, 0, 1, 25);
}