gpt4 book ai didi

java - 如何在 swing 中绘制到 JPanel

转载 作者:行者123 更新时间:2023-11-29 05:46:32 26 4
gpt4 key购买 nike

我正在用 swing 编写一个程序,它使用链接的节点来存储一个值,然后以黄色条的形式将包含的值绘制到 JPanel 中。这幅画最初是使用 AWT 完成的。我读了一点 this关于在 swing 中绘画的教程,但我仍然不明白如何向 JPanel 绘画。该程序应该在按下“随机”按钮时绘制条形图,但目前什么也没画。

我已经包含了我认为相关的代码,但如果您需要任何其他部分,请告诉我。在此先感谢您提供的任何帮助或向我指出的任何教程。

public class DataOrganizer extends JPanel 
{

private JFrame frame;

protected static final Color DEFAULT_COLOR = Color.YELLOW;

protected static final Color HIGHLIGHT_COLOR = Color.YELLOW.darker();

protected DataCollection<Item> collection; // To hold our items

protected DataCollection<Item> sortedCollection;

protected Item selected;

private final int COLLECTION_SIZE = 10, // Maximum number of items
MAXIMUM_ITEM_VALUE = 16; // Maximum value of an item

private int firstItemXCoord;

protected int firstItemYCoord;

/**
* Launch the application.
*/
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable() {
public void run()
{
try
{
DataOrganizer window = new DataOrganizer();
window.frame.setVisible(true);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}

/**
* Create the application.
*/
public DataOrganizer()
{
initialize();

}

/**
* Initialize the contents of the frame.
*/
private void initialize()
{
/*
* Create and set-up the JFrame.
*/
frame = new JFrame();
frame.setPreferredSize(new Dimension(550, 450));
frame.setBounds(100, 100, 600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
frame.setVisible(true);

/*
* Create btnRandom and add an action listener
* that calls randomAction().
*/
JButton btnRandom = new JButton("Random");
btnRandom.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
randomAction();
}
});
btnRandom.setBounds(6, 18, 117, 29);
frame.getContentPane().add(btnRandom);

/*
* Create btnMaximum and add an action listener
* that calls maximumAction().
*/
JButton btnMaximum = new JButton("Maximum");
btnMaximum.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
maximumAction();
}
});
btnMaximum.setBounds(6, 59, 117, 29);
frame.getContentPane().add(btnMaximum);

/*
* Create btnMinimum and add an action listener
* that calls minimumAction().
*/
JButton btnMinimum = new JButton("Minimum");
btnMinimum.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
minimumAction();
}
});
btnMinimum.setBounds(6, 100, 117, 29);
frame.getContentPane().add(btnMinimum);

/*
* Create btnRemove and add an action listener
* that calls removeAction().
*/
JButton btnRemove = new JButton("Remove");
btnRemove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
removeAction();
}
});
btnRemove.setBounds(6, 141, 117, 29);
frame.getContentPane().add(btnRemove);

/*
* Create btnSort and add an action listener
* that calls sort().
*/
JButton btnSort = new JButton("Sort");
btnSort.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sort();
}
});
btnSort.setBounds(6, 182, 117, 29);
frame.getContentPane().add(btnSort);

/*
* Create the JPanel, set the bounds,
* and add it to the frame.
*/
JPanel panel = new JPanel();
panel.setBounds(135, 0, 465, 378);
frame.getContentPane().add(panel);

//Initialize the unsorted collection
collection = new DataCollection<Item>(COLLECTION_SIZE);

//Initialize the sorted collection
sortedCollection = new DataCollection<Item>(COLLECTION_SIZE);

repaint();
}


public void paintComponent(Graphics panel) {

super.paintComponent(panel);

panel.drawString("Hello World", 140 , 10);

/*
* Display the Items when instantiated.
*/

if (collection != null)
{

Item item;
int xCoord = firstItemXCoord;

/*
* Reset the selected item to the start of the collection,
* ensuring it always starts at the first node
*/
collection.reset();

//While there is another node in the collection, loop through.
while (collection.hasNext())
{
/*
* Set the item to the selected node.
* Which since reset() was called on the
* collection, it should be the first node
* in the collection. Then set the next node in the
* collection a the selected one.
*/
item = collection.next();

/*
* Call the paint method in the item class
*/
item.paint(panel, xCoord, firstItemXCoord);
xCoord += Item.OVERALL_WIDTH;
}

}

/*
* Display the Items when instantiated.
*/

if (sortedCollection != null)
{
Item item;
int xCoord = firstItemXCoord + 200;

/*
* Reset the selected item to the start of the collection,
* ensuring it always starts at the first node
*/
sortedCollection.reset();

//While there is another node in the collection, loop through.
while (sortedCollection.hasNext())
{
/*
* Set the item to the selected node.
* Which since reset() was called on the
* sortedCollection, it should be the first node
* in the collection. Then set the next node in the
* collection a the selected one.
*/
item = sortedCollection.next();

/*
* Call the paint method in the item class
*/
item.paint(panel, xCoord, firstItemXCoord);
xCoord += Item.OVERALL_WIDTH;
}

}
}

//
// Random
//
public void randomAction()
{
collection.clear(); // We restart with nothing,
// then we add random items,
for (int i = 1; i <= COLLECTION_SIZE; i++)
{
collection.add(new Item((int) (1 + MAXIMUM_ITEM_VALUE
* Math.random()), DEFAULT_COLOR));
}
selected = null; // We make sure nothing is selected
}

最佳答案

查看 Custom Painting Approaches了解进行自定义绘画的几种方法。

The program is supposed to draw the bars when the "Random" button is pressed,but currently paints nothing

您可能希望使用第一种方法将对象添加到 ArrayList,这样您就有了一个要绘制的对象列表。因此按钮会添加要绘制的对象,然后您调用面板上的 repaint() 方法。

关于java - 如何在 swing 中绘制到 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15691112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com