Java 如何在JFrame上显示Graphics2D对象
这是我第一次尝试构建GUI,我陷入了一个似乎无法找到解决方案的僵局。目前,我已经设置了部分GUI,但我想插入一个在另一个类上创建的图形,但是,我不确定如何将它与我当前的JFrame链接。我可以让它作为一个单独的实体工作,但不能一起工作 主显示类:Java 如何在JFrame上显示Graphics2D对象,java,user-interface,netbeans,graphics2d,graphing,Java,User Interface,Netbeans,Graphics2d,Graphing,这是我第一次尝试构建GUI,我陷入了一个似乎无法找到解决方案的僵局。目前,我已经设置了部分GUI,但我想插入一个在另一个类上创建的图形,但是,我不确定如何将它与我当前的JFrame链接。我可以让它作为一个单独的实体工作,但不能一起工作 主显示类: public static void main(String args[]) { /* Set the Nimbus look and feel */ //<editor-fold defaultstate="collapsed"
public static void main(String args[]) {
/* 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;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(MainDisplay.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(MainDisplay.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(MainDisplay.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(MainDisplay.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainDisplay().setVisible(true);
}
});
float LvBTC;
float LvLTC;
float LvETH;
float[] HBTC;
float[] HLTC;
float[] HETH;
float CurETH;
float CurBTC;
float CurLTC;
WebScraper WS1 = new WebScraper();
LvBTC = WS1.LvScrapeBTC();
LvLTC = WS1.LvScrapeLTC();
LvETH = WS1.LvScrapeETH();
HBTC = WS1.HScrapeBTC();
HLTC = WS1.HScrapeLTC();
HETH = WS1.HScrapeETH();
System.out.println("Bitcoin's Current Price is: $"+LvBTC);
System.out.println("Litecoin's Current Price is: $"+LvLTC);
System.out.println("Ethereum's Current Price is: $"+LvETH);
Graph G1 = new Graph();
G1.CurrentValues(HBTC);
for (int i = 0; 5 > i;) {
System.out.println("Day " + (i + 1) + ": $" + G1.CurValues[i]);
i++;
}
System.out.println("Index of largest value: " + G1.IndexLarge(G1.CurValues));
System.out.println("Index of smallest value: " + G1.IndexSmall(G1.CurValues));
Graph Graphing = new Graph();
}
因此,我眼前的问题是,您正在从
JFrame
进行扩展,这不是一个好方法,因为这将UI锁定在单个用例中(不容易重用)
我的第二个问题是,您已经在JFrame
中创建了一个名为paintComponent
的方法,但是由于JFrame
不使用这种绘画风格,因此从未调用它
因此,我要做的第一件事是更改Graph
,使其从JPanel
扩展而来
public class Graph extends JPanel {
//...
然后,我会更新您的paintComponent
,使其正确支持绘制过程
@Overrride
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
//...
现在,下一个问题是,您需要提供一些大小调整提示,以便您添加组件的容器的布局管理器了解如何最好地布局组件
@Override
public Dimension getPreferredSize() {
// I've not been through your code in detail
// so I've not calculated what the actual
// preferred size might be and this is just an
// example you'll have to update
return new Dimension(200, 200);
}
现在,您可以创建
Graph
的一个实例,并将其添加到您想要的任何容器中IDE不允许我插入覆盖,并出现错误:方法不覆盖或实现来自超类型的方法。还有超级油漆组件(g);有一个错误,说找不到变量“super”。您是否遵循了公共类图形扩展JPanel{
step;)-这也会将import javax.swing.JFrame;
更改为import javax.swing.JPanel;
好的,所以我忘记了导入JPanel,但现在我仍然不确定如何让图形显示在我的JFrame上更改图形
以支持JPanel
的要点是,现在您可以随意显示它。您可以将它添加到新的JFrame
或添加到现有的JFrame
中。我是否必须设置任何可见的内容,因为到目前为止它还没有出现
@Overrride
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
//...
@Override
public Dimension getPreferredSize() {
// I've not been through your code in detail
// so I've not calculated what the actual
// preferred size might be and this is just an
// example you'll have to update
return new Dimension(200, 200);
}