如何在单个 paintComponent 覆盖中为 drawString 设置 2 种不同的字体
How to set 2 different fonts for drawString in a single paintComponent override
基本上,我正在编写自己的数独应用程序,对于(MVC 的)视图部分,我有一个 JPanel,它覆盖 paintComponent 并绘制数独单元格、网格和选定单元格等。但我的问题是我需要两种不同的字体大小(例如,一种用于用户在单元格中放置注释,另一种用于单元格中的实际数字),并且每次我调用 setFont 时,所有已经在任何单元格中的文本也会发生变化尺码..
据我了解,我猜 setFont 将字体应用于单个组件中的所有文本?在我的例子中,我只有 Cell[][] table 来存储每个单元格的数字和注释。
class Cell {
private Point coords;
private boolean[] notes;
private int number;
// Constructor + Accessors + Getters
}
所以在 paintComponent 中,我遍历所有单元格并相应地绘制数字,但是对 setFont 的任何调用都会更改网格中已有的所有文本。
class SudokuPanel extends JPanel {
private static final int SUDOKU_SIZE = 9;
private Cell[][] cells;
private static final Font BIG_FONT = new Font("Verdana", Font.BOLD, 50),
SMALL_FONT = new Font("Verdana", Font.PLAIN, 12);
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
//drawGrid(g);
//drawSelected(g);
drawCells(g);
}
private void drawCells(Graphics g) {
for (int x=0; x<SUDOKU_SIZE; x++)
for (int y=0; y<SUDOKU_SIZE; y++)
drawCell(g, cells[x][y]);
}
private void drawCell(Graphics g, Cell cell) {
if (cell.number == 0 && cell.hasNotes())
drawNotes(g, cell);
else if (cell.number != 0)
writeNumber(g, cell.number, cell);
}
private void drawNotes(Graphics g, Cell cell) {
for (int i=0; I<cell.notes.length; i++)
if (cell.notes[i])
writeNote(g, i, cell);
}
private void writeNote(Graphics g, int i, Cell cell) {
setFont(SMALL_FONT); // for small size
writeStr(g, ""+i, cell.coords.x, cell.coords.y); // definitely wrong drawing coords but not the topic of this post
}
private void writeNumber(Graphics g, int i, Cell cell) {
setFont(BIG_FONT); // for big font size
writeStr(g, ""+i, cell.coords.x, cell.coords.y);
}
}
所以基本上 setFont 大小只考虑了对 setFont 的最后一次调用,所以我应该让我的 Cell POJO 扩展 JComponent 吗?并让他们每个人通过重写他们自己的 paintComponent 方法来绘制自己,其中每个人都将相应地设置不同的字体大小?像这样:
class Cell extends JComponent {
private static final Font BIG_FONT = new Font("Verdana", Font.BOLD, 50),
SMALL_FONT = new Font("Verdana", Font.PLAIN, 12);
//cell code
@Override
public void paintComponent(Graphics g) {
if (hasNotes()) {
setFont(SMALL_FONT);
// write notes
} else {
setFont(BIG_FONT);
// write number
}
}
}
但是我不知道如何将单元格用作组件并将它们与我的 JPanel 的 paintComponent 合并..
总而言之,我基本上只希望一些单元格具有写入实际值的大数字,而其他单元格则在单个单元格中具有多个小数字,显示该单元格的注释。感谢您提供的任何帮助
不要调用组件的 setFont
,在绘制文本之前调用 Graphics
'。
基本上,我正在编写自己的数独应用程序,对于(MVC 的)视图部分,我有一个 JPanel,它覆盖 paintComponent 并绘制数独单元格、网格和选定单元格等。但我的问题是我需要两种不同的字体大小(例如,一种用于用户在单元格中放置注释,另一种用于单元格中的实际数字),并且每次我调用 setFont 时,所有已经在任何单元格中的文本也会发生变化尺码..
据我了解,我猜 setFont 将字体应用于单个组件中的所有文本?在我的例子中,我只有 Cell[][] table 来存储每个单元格的数字和注释。
class Cell {
private Point coords;
private boolean[] notes;
private int number;
// Constructor + Accessors + Getters
}
所以在 paintComponent 中,我遍历所有单元格并相应地绘制数字,但是对 setFont 的任何调用都会更改网格中已有的所有文本。
class SudokuPanel extends JPanel {
private static final int SUDOKU_SIZE = 9;
private Cell[][] cells;
private static final Font BIG_FONT = new Font("Verdana", Font.BOLD, 50),
SMALL_FONT = new Font("Verdana", Font.PLAIN, 12);
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
//drawGrid(g);
//drawSelected(g);
drawCells(g);
}
private void drawCells(Graphics g) {
for (int x=0; x<SUDOKU_SIZE; x++)
for (int y=0; y<SUDOKU_SIZE; y++)
drawCell(g, cells[x][y]);
}
private void drawCell(Graphics g, Cell cell) {
if (cell.number == 0 && cell.hasNotes())
drawNotes(g, cell);
else if (cell.number != 0)
writeNumber(g, cell.number, cell);
}
private void drawNotes(Graphics g, Cell cell) {
for (int i=0; I<cell.notes.length; i++)
if (cell.notes[i])
writeNote(g, i, cell);
}
private void writeNote(Graphics g, int i, Cell cell) {
setFont(SMALL_FONT); // for small size
writeStr(g, ""+i, cell.coords.x, cell.coords.y); // definitely wrong drawing coords but not the topic of this post
}
private void writeNumber(Graphics g, int i, Cell cell) {
setFont(BIG_FONT); // for big font size
writeStr(g, ""+i, cell.coords.x, cell.coords.y);
}
}
所以基本上 setFont 大小只考虑了对 setFont 的最后一次调用,所以我应该让我的 Cell POJO 扩展 JComponent 吗?并让他们每个人通过重写他们自己的 paintComponent 方法来绘制自己,其中每个人都将相应地设置不同的字体大小?像这样:
class Cell extends JComponent {
private static final Font BIG_FONT = new Font("Verdana", Font.BOLD, 50),
SMALL_FONT = new Font("Verdana", Font.PLAIN, 12);
//cell code
@Override
public void paintComponent(Graphics g) {
if (hasNotes()) {
setFont(SMALL_FONT);
// write notes
} else {
setFont(BIG_FONT);
// write number
}
}
}
但是我不知道如何将单元格用作组件并将它们与我的 JPanel 的 paintComponent 合并..
总而言之,我基本上只希望一些单元格具有写入实际值的大数字,而其他单元格则在单个单元格中具有多个小数字,显示该单元格的注释。感谢您提供的任何帮助
不要调用组件的 setFont
,在绘制文本之前调用 Graphics
'。