- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的程序,可以绘制从一个单元格到另一个单元格的线条,形成一条路径。我有两组路径:一组由红细胞形成,另一组由蓝细胞形成。我一次只能设置一种颜色,并且它适用于两个组。
现在我要做的是设置线条的颜色以匹配单元格的颜色,每个组都有自己的线条颜色。我使用自定义绘画在 glassPane
上绘制线条,代码如下:
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED); //Lines' Color is set here
g2d.setStroke(new BasicStroke(3));
for(List<JLabel> line : lines) {
for(int i=0; i <(line.size()) ; i++) {
JLabel label1 = line.get(i);
int n = (i == (line.size()-1)) ? 0: i+1;
JLabel label2 = line.get(n);
g2d.draw(new Line2D.Float(getCenter(label1), getCenter(label2)));
}
}
g2d.dispose();
}
我怎样才能做到这一点?我正在考虑制作一个取决于每个单元格组的变量 color
,但没有找到如何执行此操作。
下面是您可以测试的示例(注意:我删除了所有导入语句):
public class Example extends JPanel {
enum Token {VIDE, CERCLE_BLEU, CERCLE_ROUGE}
private static final int ICON_W = 21;
private JLabel[][] grid;
private Map<Token, Icon> iconMap = new EnumMap<>(Token.class);
List<JLabel> redCels = new ArrayList<>();
List<JLabel> blueCells = new ArrayList<>();
List<List<JLabel>> paths = new ArrayList<>();
Example(int rows, int cols) {
setLayout(new GridLayout(rows, cols, 1, 1));
setBorder(BorderFactory.createLineBorder(Color.BLACK));
setBackground(Color.BLACK);
iconMap.put(Token.VIDE, createIcon(new Color(0, 0, 0, 0)));
iconMap.put(Token.CERCLE_BLEU, createIcon(Color.BLUE));
iconMap.put(Token.CERCLE_ROUGE, createIcon(Color.RED));
createGrid(rows, cols);
setTestData();
}
private Icon createIcon(Color color) {
BufferedImage img = new BufferedImage(ICON_W, ICON_W, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img.createGraphics();
g2.setColor(color);
g2.fillOval(1, 1, ICON_W - 2, ICON_W - 2);
g2.dispose();
return new ImageIcon(img);
}
void createGrid(int rows, int cols) {
grid = new JLabel[rows][cols];
for (int r = 0; r < grid.length; r++) {
for (int c = 0; c < grid[r].length; c++) {
grid[r][c] = new JLabel(iconMap.get(Token.VIDE));
grid[r][c].setOpaque(true);
grid[r][c].setBackground(Color.WHITE);
grid[r][c].setPreferredSize(new Dimension(ICON_W, ICON_W));
add(grid[r][c]);
}
}
}
void setTestData() {
//test data
set(11, 3, Token.CERCLE_ROUGE);
set(10, 2, Token.CERCLE_ROUGE);
set(9, 3, Token.CERCLE_ROUGE);
set(10, 4, Token.CERCLE_ROUGE);
set(8, 13, Token.CERCLE_BLEU);
set(9, 12, Token.CERCLE_BLEU);
set(10, 13, Token.CERCLE_BLEU);
set(9, 14, Token.CERCLE_BLEU);
paths.add(redCels); paths.add(blueCells);
}
void set(int row, int col, Token token) {
grid[row][col].setIcon(iconMap.get(token));
if(token == Token.CERCLE_ROUGE) {
redCels.add(grid[row][col]);
}else {
blueCells.add(grid[row][col]);
}
}
private List<List<JLabel>> getPahs() {
return paths;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("TEST CASE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Example example = new Example(20, 20);
frame.add(example);
DrawLines glassPane = new DrawLines(example.getPahs());
frame.setGlassPane(glassPane);
frame.getGlassPane().setVisible(true);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
}
});
}
}
//used as glass pane to draw lines
class DrawLines extends JPanel {
private List<List<JLabel>> lines;
DrawLines(List<List<JLabel>> lines) {
this.lines = lines;
setOpaque(false);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED);
g2d.setStroke(new BasicStroke(3));
for(List<JLabel> line : lines) {
for(int i=0; i <(line.size()) ; i++) {
JLabel label1 = line.get(i);
int n = (i == (line.size()-1)) ? 0: i+1;
JLabel label2 = line.get(n);
g2d.draw(new Line2D.Float(getCenter(label1), getCenter(label2)));
}
}
g2d.dispose();
}
private Point getCenter(JComponent comp) {
int x = comp.getX()+ (comp.getWidth()/2);
int y = comp.getY() + (comp.getHeight()/2);
return new Point(x,y);
}
}
最佳答案
我建议采用以下方法:
修改 Token
枚举,使其包含颜色和图标信息:
enum Token {
VIDE (Color.WHITE), CERCLE_BLEU (Color.BLUE), CERCLE_ROUGE(Color.RED);
private static final int ICON_W = 21;
public Color color;
public Icon icon;
Token(Color color) {
this.color = color;
icon = createIcon(color);
}
private Icon createIcon(Color color) {
BufferedImage img = new BufferedImage(ICON_W, ICON_W, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img.createGraphics();
g2.setColor(color);
g2.fillOval(1, 1, ICON_W - 2, ICON_W - 2);
g2.dispose();
return new ImageIcon(img);
}
}
子类 JLabel
以创建可以使用 Token
初始化的 JLabel
:
class TLabel extends JLabel{
Token token;
TLabel(Token token) {
setToken(token);
}
void setToken(Token token) {
this.token = token;
setIcon(token.icon);
setPreferredSize(new Dimension(
token.icon.getIconWidth(), token.icon.getIconHeight()));
}
Token getToken() {
return token;
}
Color getColor() {
return token.color;
}
}
请注意,TLabel
的实例包含Token
和颜色信息,具有适当的图标和正确的首选大小。
在您的应用程序中使用 TLabel
,如下所示:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Example extends JPanel {
private TLabel[][] grid;
List<TLabel> redCels = new ArrayList<>();
List<TLabel> blueCells = new ArrayList<>();
List<List<TLabel>> paths = new ArrayList<>();
Example(int rows, int cols) {
setLayout(new GridLayout(rows, cols, 1, 1));
setBorder(BorderFactory.createLineBorder(Color.BLACK));
setBackground(Color.BLACK);
createGrid(rows, cols);
setTestData();
}
void createGrid(int rows, int cols) {
grid = new TLabel[rows][cols];
for (int r = 0; r < grid.length; r++) {
for (int c = 0; c < grid[r].length; c++) {
grid[r][c] = new TLabel(Token.VIDE);
grid[r][c].setOpaque(true);
grid[r][c].setBackground(Color.WHITE);
add(grid[r][c]);
}
}
}
void setTestData() {
//test data
set(11, 3, Token.CERCLE_ROUGE);
set(10, 2, Token.CERCLE_ROUGE);
set(9, 3, Token.CERCLE_ROUGE);
set(10, 4, Token.CERCLE_ROUGE);
set(8, 13, Token.CERCLE_BLEU);
set(9, 12, Token.CERCLE_BLEU);
set(10, 13, Token.CERCLE_BLEU);
set(9, 14, Token.CERCLE_BLEU);
paths.add(redCels); paths.add(blueCells);
}
void set(int row, int col, Token token) {
grid[row][col].setToken(token);
if(token == Token.CERCLE_ROUGE) {
redCels.add(grid[row][col]);
}else {
blueCells.add(grid[row][col]);
}
}
private List<List<TLabel>> getPahs() {
return paths;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("TEST CASE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Example example = new Example(20, 20);
frame.add(example);
DrawLines glassPane = new DrawLines(example.getPahs());
frame.setGlassPane(glassPane);
frame.getGlassPane().setVisible(true);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
}
});
}
}
enum Token {
VIDE (Color.WHITE), CERCLE_BLEU (Color.BLUE), CERCLE_ROUGE(Color.RED);
private static final int ICON_W = 21;
public Color color;
public Icon icon;
Token(Color color) {
this.color = color;
icon = createIcon(color);
}
private Icon createIcon(Color color) {
BufferedImage img = new BufferedImage(ICON_W, ICON_W, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img.createGraphics();
g2.setColor(color);
g2.fillOval(1, 1, ICON_W - 2, ICON_W - 2);
g2.dispose();
return new ImageIcon(img);
}
}
class TLabel extends JLabel{
Token token;
TLabel(Token token) {
setToken(token);
}
void setToken(Token token) {
this.token = token;
setIcon(token.icon);
setPreferredSize(new Dimension(
token.icon.getIconWidth(), token.icon.getIconHeight()));
}
Token getToken() {
return token;
}
Color getColor() {
return token.color;
}
}
//used as glass pane to draw lines
class DrawLines extends JPanel {
private List<List<TLabel>> lines;
DrawLines(List<List<TLabel>> lines) {
this.lines = lines;
setOpaque(false);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setStroke(new BasicStroke(3));
for(List<TLabel> line : lines) {
//use color information from TLabel
//the whole path is of the same color so do it one per path
g2d.setColor(line.get(0).getColor());
for(int i=0; i <(line.size()) ; i++) {
TLabel label1 = line.get(i);
int n = (i == (line.size()-1)) ? 0: i+1;
TLabel label2 = line.get(n);
g2d.draw(new Line2D.Float(getCenter(label1), getCenter(label2)));
}
}
g2d.dispose();
}
请注意,要设置线条颜色,您只需从 TLabel
中获取颜色,例如:g2d.setColor(tLabel.getColor());
关于java - 如何根据二维网格上的路径为线条设置不同的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44178044/
您能否建议如何在 Bootstrap 或 IE 兼容的 CSS 网格中,在没有 CSS 网格的情况下进行以下布局。 在大屏幕中 头部,左侧堆叠的 body 和右侧覆盖头部和 body 高度的图像。 [
我想在 Objective-C 中绘制一个 15*15 的网格。格子颜色是蓝色的,就像在诺基亚制作“贪吃蛇”游戏的棋盘一样。 我试过使用 for 循环来创建 subview ,但它似乎不起作用,我查看
我正在尝试将 CSS 网格与 grid-template-columns: repeat(auto-fill, auto) 一起使用,单元格被设置为最大宽度,导致每行一个元素。 p> 是否可以让元素宽
我正在努力在网格的自定义列上添加一个指向网站的简单、简单的链接。我用了 Inchoo blog为列添加自定义渲染器,它可以工作。我认为只需修改渲染并添加标签就足够了。但我的希望破灭了,行不通。 如何做
使用 Gnuplot 我绘制了下图 - 现在,正如您在图像中看到的那样,很难在线条之间识别出其末端的块。所以我想用不同的颜色或样式交替着色网格。 我现在用来给网格着色的代码是 - set style
假设我有一个非常简单的 WPF 网格(6 行 x 6 列),定义如下:
我有一个希望绑定(bind)到 WPF 网格的集合。 我面临的问题是列数是动态的并且取决于集合。这是一个简单的模型: public interface IRows { string Messa
我正在使用 Vaadin 8,我想制作某种混淆矩阵。我想知道是否可以根据单元格位置而不是数据提供者手动填充表格/网格的值。 referenceTable.addColumn(reference ->
我在 http://jsfiddle.net/TsRJy/ 上创建了一个带有 div 框的网格. 问题 我不知道如何使 a:hover 工作。 信息 重写 HTML 代码,因为表格不适合我。 http
银光处女在这里。如何使网格周围的用户控件自动调整大小以适应内部网格宽度?目前,当浏览器窗口更宽时,用户控件的显示尺寸约为 300 或 400 像素。它在数据网格周围呈现垂直和水平滚动条,这很丑陋。我想
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我想使用 CSS Grid 的 grid-template-areas。 但问题是我正在使用的 CMS 添加了大量额外的包装器。有没有办法忽略额外的包装?因为它弄乱了漂亮的网格区域...... 我正在
在我的Grid中,当我单击“操作”按钮(下面的代码中显示的“删除和编辑”按钮)时,我需要弹出一个窗口,而不用警告消息提醒用户; 在下面的代码中,我正在使用HANDLER handler: button
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我需要模拟一个仓库,其中有几辆自动驾驶车辆在给定的布局上移动,并具有简单的优先级规则。根据我的理解,这个问题可以通过离散事件模拟(DES)轻松解决,我会使用 SimPy为了这。 我看到的问题是,我似乎
在 ASP.NET 中,我可以让用户控件在页面上的表格中占据多个单元格: 用户控件1: foo bar 第1页: 并且自动调整列宽以适应最大的用户控件。 这也可以在 WPF
我正在寻找一种方法来实时搜索我的网格+要过滤的复选框。我有一个包含学生的网格(照片和姓名)。我想要的是有一个复选框,可以过滤学生所在的不同类(class)。还有一个搜索栏,我可以在其中输入学生姓名。
我正在使用 jQuery 和 jQuery UI 构建一个 Web 应用程序。我陷入了僵局。我需要的是一个 jQuery 网格,它具有可编辑字段,并以某种方式在这些可编辑单元格之一上合并一个自动完成字
我想知道是否有其他 JavaScript 组件可以提供具有多个分组的网格表示。下面是jqGrid的截图我扩展了允许该功能,但它需要获取所有数据。我希望在扩展分组时加载数据。 另一个修改后的 jqGri
我一直在为我将在此处描述的 CSS 问题而烦恼: 在下面的示例 ( https://codesandbox.io/s/jjq4km89y5 ) 中,您可以看到一个可滚动的内容(紫色背景)和一个被左侧面
我是一名优秀的程序员,十分优秀!