java GUI分配数组值

前端之家收集整理的这篇文章主要介绍了java GUI分配数组值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

有一个Paraview用户界面如下吸引我.

Paraview control UI

我认为这个接口可以用来为数组赋值.它的工作原理如下:

array

我想将它实现为Java程序,但我发现没有Java API可以支持我的想法.与我最接近的设计是添加多个JSlider,如下所示:

enter image description here

但是,如果它是一个100大小的阵列,我不想添加100个JSliders.你有更好的解决方案吗?

最佳答案
好的,所以这是一个非常基本的例子.它需要更多的工作和优化,但应该让你朝着正确的方向前进

有关详细信息,请查看Painting in AWT and Swing,Performing Custom Painting,2D GraphicsHow to Write a Mouse Listener

Array Graph

  1. import java.awt.Color;
  2. import java.awt.Dimension;
  3. import java.awt.EventQueue;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.Point;
  7. import java.awt.Shape;
  8. import java.awt.event.MouseAdapter;
  9. import java.awt.event.MouseEvent;
  10. import java.awt.geom.Ellipse2D;
  11. import java.awt.geom.Path2D;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. import javax.swing.JFrame;
  15. import javax.swing.JPanel;
  16. import javax.swing.UIManager;
  17. import javax.swing.UnsupportedLookAndFeelException;
  18. public class TestGraph {
  19. public static void main(String[] args) {
  20. new TestGraph();
  21. }
  22. public TestGraph() {
  23. EventQueue.invokeLater(new Runnable() {
  24. @Override
  25. public void run() {
  26. try {
  27. UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  28. } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
  29. ex.printStackTrace();
  30. }
  31. JFrame frame = new JFrame("Testing");
  32. frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  33. frame.add(new GraPHPane(0,100,new int[100]));
  34. frame.pack();
  35. frame.setLocationRelativeTo(null);
  36. frame.setVisible(true);
  37. }
  38. });
  39. }
  40. public static class GraPHPane extends JPanel {
  41. protected static final int COLUMN_WIDTH = 10;
  42. protected static final int VERTICAL_INSETS = 10;
  43. private int[] data;
  44. private int minValue,maxValue;
  45. private Path2D.Double graph;
  46. private ListPHPane(int minValue,int maxValue,int[] data) {
  47. this.data = data;
  48. this.minValue = minValue;
  49. this.maxValue = maxValue;
  50. buttons = new ArrayList<>(data == null ? 25 : data.length);
  51. updateView();
  52. MouseAdapter ma = new MouseAdapter() {
  53. @Override
  54. public void mouseClicked(MouseEvent e) {
  55. updateData(e);
  56. }
  57. @Override
  58. public void mouseDragged(MouseEvent e) {
  59. updateData(e);
  60. }
  61. };
  62. addMouseListener(ma);
  63. addMouseMotionListener(ma);
  64. }
  65. protected void updateData(MouseEvent e) {
  66. // Which "column" was clicked on
  67. int column = (int) Math.round(((double) e.getX() / (double) COLUMN_WIDTH)) - 1;
  68. // Get the "height" of the clickable area
  69. int clickRange = getHeight() - (VERTICAL_INSETS * 2);
  70. // Adjust the y click point for the margins...
  71. int yPos = e.getY() - VERTICAL_INSETS;
  72. // Calculate the vertical position that was clicked
  73. // this ensures that the range is between 0 and clickRange
  74. // You could choose to ignore values out side of this range
  75. int row = Math.min(Math.max(clickRange - yPos,0),clickRange);
  76. // Normalise the value between 0-1
  77. double clickNormalised = row / (double) clickRange;
  78. // Calculate the actual row value...
  79. row = minValue + (int) (Math.round(clickNormalised * maxValue));
  80. // Update the data
  81. data[column] = row;
  82. mousePoint = new Point(
  83. COLUMN_WIDTH + (column * COLUMN_WIDTH),getHeight() - (VERTICAL_INSETS + (int) Math.round((data[column] / 100d) * clickRange)));
  84. updateView();
  85. repaint();
  86. }
  87. @Override
  88. public void invalidate() {
  89. super.invalidate();
  90. updateView();
  91. }
  92. protected Shape createButton(int xPos,int yPos) {
  93. return new Ellipse2D.Double(xPos - COLUMN_WIDTH / 2,yPos - COLUMN_WIDTH / 2,COLUMN_WIDTH,COLUMN_WIDTH);
  94. }
  95. protected void updateView() {
  96. graph = new Path2D.Double();
  97. buttons.clear();
  98. if (data != null && data.length > 0) {
  99. int verticalRange = getHeight() - (VERTICAL_INSETS * 2);
  100. int xPos = COLUMN_WIDTH;
  101. int yPos = getHeight() - (VERTICAL_INSETS + (int) Math.round((data[0] / 100d) * verticalRange));
  102. graph.moveTo(xPos,yPos);
  103. if (data[0] > 0) {
  104. buttons.add(createButton(xPos,yPos));
  105. }
  106. for (int index = 1; index < data.length; index++) {
  107. xPos = (index * COLUMN_WIDTH) + COLUMN_WIDTH;
  108. yPos = getHeight() - (VERTICAL_INSETS + (int) Math.round((data[index] / 100d) * verticalRange));
  109. graph.lineTo(xPos,yPos);
  110. if (data[index] > 0) {
  111. buttons.add(createButton(xPos,yPos));
  112. }
  113. }
  114. }
  115. }
  116. @Override
  117. public Dimension getPreferredSize() {
  118. return new Dimension(data == null ? 0 : (data.length + 1) * COLUMN_WIDTH,200);
  119. }
  120. @Override
  121. protected void paintComponent(Graphics g) {
  122. super.paintComponent(g);
  123. if (data != null) {
  124. Graphics2D g2d = (Graphics2D) g.create();
  125. g2d.setColor(new Color(64,64,32));
  126. for (int index = 0; index < data.length; index++) {
  127. int xPos = (index * COLUMN_WIDTH) + COLUMN_WIDTH;
  128. g2d.drawLine(xPos,VERTICAL_INSETS,xPos,getHeight() - VERTICAL_INSETS);
  129. }
  130. g2d.setColor(Color.BLACK);
  131. g2d.draw(graph);
  132. for (Shape button : buttons) {
  133. g2d.fill(button);
  134. }
  135. if (mousePoint != null) {
  136. g2d.setColor(new Color(255,192,203));
  137. Ellipse2D dot = new Ellipse2D.Double((mousePoint.x - COLUMN_WIDTH / 2) - 2,(mousePoint.y - COLUMN_WIDTH / 2) - 2,COLUMN_WIDTH + 4,COLUMN_WIDTH + 4);
  138. g2d.draw(dot);
  139. g2d.setColor(new Color(255,203,128));
  140. g2d.fill(dot);
  141. }
  142. g2d.dispose();
  143. }
  144. }
  145. }
  146. }

在任何人说我没有填写“填充”之前,我故意使用Path2D使其更简单地实现;)

猜你在找的Java相关文章