我有一个程序,将点数添加到列表中,并计算这些点数所创建的数字区域。我不能添加那个窗口的屏幕,但我要解释一下发生了什么。我用Java创建了JFrameForm,在左边放置了一些标签和文本字段,在右边留下了一些空间来绘制我添加到列表中的点。问题是,每当我画任何东西时,窗户都会变成空白。单击标签时,标签消失,文本字段出现。
我的第二个问题是如何用油漆()功能以外的其他方式画某物?假设我将点添加到列表中,当我单击一个按钮时,我希望它在窗口的右边绘制(使用drawOval()或推荐我使用其他函数)。
//所有进口
公共类NewJFrame扩展javax.swing.JFrame {
public void paint(Graphics g) {
g.drawLine(600, 150, 700, 150);
}
public NewJFrame() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jLabel3 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1.setLabelFor(jTextField1);
jLabel1.setText("X: ");
jLabel1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
jLabel2.setLabelFor(jTextField2);
jLabel2.setText("Y:");
jLabel2.setName("labelY"); // NOI18N
jTextField1.setName("textX"); // NOI18N
jTextField2.setName("textY"); // NOI18N
jTextField2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField2ActionPerformed(evt);
}
});
jButton1.setText("ADD");
jButton1.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jButton2.setText("PROCEED");
jButton2.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
jLabel3.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addGap(18, 18, 18)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addGap(18, 18, 18)
.addComponent(jTextField2))))
.addGroup(layout.createSequentialGroup()
.addGap(6, 6, 6)
.addComponent(jButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton2))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 316, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(419, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(86, 86, 86)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel1))
.addGap(26, 26, 26)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2))
.addGap(32, 32, 32)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton1)
.addComponent(jButton2))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 33, Short.MAX_VALUE)
.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(24, 24, 24))
);
jLabel1.getAccessibleContext().setAccessibleName("labelX");
jLabel2.getAccessibleContext().setAccessibleName("labelY");
jTextField1.getAccessibleContext().setAccessibleName("textX");
jTextField2.getAccessibleContext().setAccessibleName("textY");
pack();
}// </editor-fold>
private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
protected List<Point> list = new ArrayList<>();
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
list.add(new Point( Integer.valueOf(jTextField1.getText()), Integer.valueOf(jTextField2.getText()) ));
}catch(NumberFormatException e) {
System.out.println("Error");
}
jTextField1.setText("");
jTextField2.setText("");
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
TwoLists two = new TwoLists(list);
list = two.sortLists();
jLabel3.setText("Area: " + Triangularyzacja.countFigureArea(list));
}
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
// End of variables declaration }
这是代码(对样式表示遗憾,但不知道如何更好地粘贴它)。它全部是由NetBeans生成的,尽管paint()函数位于开头,它破坏了所有的布局(它正在变为空白)。我还有8个类,其中包含机械代码。
发布于 2016-01-15 18:47:33
首先,您需要一个组件像JPanel或JLabel之类的东西,而不仅仅是框架本身(而且组件是否透明也没关系(不透明=真)。这将使你更好地控制未来的发展。
假设它是您放置在GUI表单上的一个JPanel (例如jPanel1),并且您想要在其上进行绘图,您可以创建和使用类似于此的方法(任意命名该方法:):
public static void drawMyStuff(JPanel panel) {
// Declare and initialize a graphics object
// based on the supplied component.
Graphics g = panel.getGraphics();
// Set the color we want to use...
g.setColor(Color.red);
// Draw a red line horizontally through the
// center of the supplied component.
g.drawLine(0, panel.getHeight()/2, panel.getWidth(), panel.getHeight()/2);
// Close the Graphics object, we don't need it anymore.
g.dispose();
// Update the supplied component so as
// to display what we've drawn.
panel.revalidate();
}你能把这种方法放在哪里?在项目中的任何公共类中。
您将如何和在何处调用此方法?
drawMyStuff(jPanel1);只要可以获得对提供的组件的引用,就可以在任何地方调用这个方法(因为它是一个公共方法)。
基本上,这意味着您应该在您所提供的JPanel所在的同一个类中调用此方法,当然,除非JPanel本身也是公共的。
您可能想要调用此方法,可能是从一个actionPerformed事件中调用的:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
drawMyStuff(jPanel1);
}如果您希望在JLabel上绘图,那么只需更改方法声明中的参数声明,
例如:
public static void drawMyStuff(JLabel panel) {....}或者,如果您确实想要直接绘制到JFrame,那么:
public static void drawMyStuff(JFrame panel) {....} 如果要直接绘制到 JFrame 表单上,则可以从扩展的JFrame类调用此方法,如:
drawMyStuff(this);现在,drawMyStuff()方法不是很实用。它只是在我提供的组件的中心画一条红线。如果我想根据应用程序中的某些条件不时地更改颜色和或行长,该怎么办?
在这种情况下,我们需要向方法声明中添加更多的参数,并根据需要使用这些参数来修改绘制的线条。让我们向方法中添加一些参数,以处理颜色、行起点(以像素为单位)和行结束点(以像素为单位)。下面是我们的新方法声明:
public static void drawMyStuff(JPanel panel, Color color, int startPoint, int endPoint) { ... }正如您在上面的方法声明中所看到的,我们仍然有我们的组件对象(在本例中是一个JPanel ),我们需要这样做,这样我们的方法就知道要使用什么了。我们还添加了一个名为的颜色对象参数,这样我们就可以提供我们想要的颜色。
我们还添加了两个名为startPoint和endPoint的整数类型参数。startPoint参数将告诉我们的方法从何处开始沿着所提供的组件内的X轴(水平平面)绘制彩色线。endPoint参数将告诉我们的方法,在同一水平轴上结束我们的彩色线。这两个参数决定了以像素为单位的实际行长(endPoint - startPoint =长度(以像素为单位)。
现在我们有了额外的参数,让我们修改我们的方法代码体以适应这些非常相同的参数:
public static void drawMyStuff(JPanel panel, Color color, int startPoint, int endPoint) {
// Declare and initialize a graphics object
// based on the supplied JPanel.
Graphics g = panel.getGraphics();
// Set the color we want to use...
g.setColor(color); // here we supply our color parameter
// Draw a red line horizontally through the
// center of the supplied JPanel. Notice our
// new startPoint and endPoint parameters are
// supplied here.
g.drawLine(startPoint, panel.getHeight()/2, endPoint, panel.getHeight()/2);
// Close the Graphics object, we don't need it anymore.
g.dispose();
// Update the supplied JPanel so as
// to display what we've drawn.
panel.revalidate();
}要调用这个方法,我们可以这样做:
drawMyStuff(jPanel1, Color.blue, 20, 80);这将画一个蓝色的60像素长的直线沿jPanel1的中心水平,从左侧边缘开始20像素。
我知道画一条简单的线不是你想要做的事情,但是现在你知道如何轻松地修改这个方法,让它做你想做的任何事情。
https://stackoverflow.com/questions/34814378
复制相似问题