我正在开发一个“绘图”应用程序。整个“绘图”不断存储在一个BufferedImage对象中(使用不断更新循环)。让我们称之为drawingArea。
我正在使用BufferedImage类的getSubimage()方法实现一个选择工具。用户使用此工具选择绘图的一个区域,并将其粘贴到绘图的任何位置。
用户通过拖动鼠标选择一个区域,当他/她释放鼠标时,选择的区域存储在一个BufferedImage. 这是通过调用drawingArea的getSubimage( /* properties of the selected rectangular area */ )方法,并将返回值放入其中BufferedImage(让我们称之为selectedArea)来完成的。
这个操作只执行一次(也就是说,一旦里面有一个值selectedArea,就没有任何代码给 分配任何新的东西selectedArea)。
但是,我发现(并且确信这一点),存储在其中的值selectedArea确实发生了变化 - 它存储的图像会更新!
含义:如果用户选择一个区域(此时保存了该区域副本的图像),然后在该区域内绘制一些东西,然后粘贴图片 - 粘贴的图片将是绘制后的图片,并且不是在它之前。
怎么会这样?是否getSubimage()返回BufferedImage在原点更新时更新的 a?(又名它被复制的区域)?这似乎很愚蠢,但在这一点上,在我看来它是唯一的选择。
我有以下代码:
private double doThings(List<ClassA> list){
ClassB[] array = list.toArray(new ClassB[0]);
// ...
}
Run Code Online (Sandbox Code Playgroud)
这编译.为什么?
我有一个template <typename T> class MyClass带有方法的模板类:
void add (T& item) {
data[indexToInsert++] = &item; // data is an array of T*
}
Run Code Online (Sandbox Code Playgroud)
主要:
MyClass<int> thing;
thing.add(10);
Run Code Online (Sandbox Code Playgroud)
在第二行,我收到此错误:
no matching function for call to MyClass::add(int)
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
在任何实现中,以下内容始终正确吗?
(strlen("some string with weird characters") + 1) * sizeof(char)
== sizeof("some string with weird characters");
Run Code Online (Sandbox Code Playgroud)
我问我是否可以可靠地用于(strlen(my_string) + 1) * sizeof(char)计算任何字符串的二进制大小。另外,请告诉我是否有更好的方法。
我想确保我明白一些事情.请确认这是否属实.
一个我声明一个线程,并在其中运行一些东西 - 从那一点开始的一切都将在该线程内运行,除非我明确地创建一个新线程.无论代码通过多少个类和方法 - 它都将保留在同一个线程中.
例如,假设我有一个完全在一个自定义JFrame内运行的应用程序.如果我希望整个应用程序在同一个线程内运行,我可以通过创建一个新线程,并在该线程的run()方法中实例化新的JFrame来实现.
这实际上是否会确保整个应用程序将在创建JFrame的线程内运行,除非我显式创建一个新线程并在该新线程内运行某些东西?
这是一个普遍的问题,但让我先谈谈Swing:
如果我希望整个Swing应用程序在EDT内运行(如果我错了请纠正我 - 正是我大部分时间都需要使用Swing),SwingUtilities.invokeLater()在main方法中使用一次就足够了,如下所示:
public static void main(String[]args){
SwingUtilities.invokeLater( new Runnable(){
JFrame frame = new CustomJFrame(); // where the entire application runs.
} );
}
Run Code Online (Sandbox Code Playgroud) 我在JPanel中有一个JTextArea.JPanel设置为默认的FlowLayout.
我通过构造函数为JTextArea分配了一个大小:new JTextArea(50,50).
但是,一旦超出某个范围,不仅会忽略我指定的大小(例如,如果我将大小设置为大于40*40的值,程序就会开始忽略我说的内容,而是将JTextArea设置为某些任意大小) - 大小也随着我输入而改变.如果我在其中键入的内容超过它可以包含的内容,则JTextArea会自行调整大小.
我做了:
textArea.setLineWrap(true);
没有解决这个问题.
如何为JTextArea设置固定大小?
我试图理解68000汇编中的"S [cc]"指令集.
指令的格式如下:
S[cc] reg
Run Code Online (Sandbox Code Playgroud)
[cc]是条件代码(例如,SEQ表示"如果等于设置").如果指定的条件[cc]为真,则寄存器设置为全部1s.否则,寄存器设置为全部0s.
有一点我不明白:S[cc]操作在哪里检查条件是否为真?它会检查标志吗?
如果是这样,那么如果我想要注册D0来保存表达式的结果,那么D0 = D1这就是我需要做的:
CMP D0,D1 ; this sets the flags according to the result
SEQ D0 ; sets D0 to true if the flags indicate the condition is true. else, sets it to false.
Run Code Online (Sandbox Code Playgroud)
它是否正确?或者我不能正确理解这个操作?
在C++中,我们delete在new编辑它之后总是需要一个指针.
但我试图理解是否只是删除指针,或者也调用指向对象的析构函数.
例如:
Thing* pointer = new Thing;
// .. some code
delete pointer;
Run Code Online (Sandbox Code Playgroud)
这会调用指向的对象的析构函数pointer吗?或者它只会破坏指针?
我有一个属性,我希望它在设置时设置另一个属性.例如:
private double Bpm
{
set
{
<myself> = value;
_bps = <myself> / 60;
}
get
{
return <myself>;
}
}
Run Code Online (Sandbox Code Playgroud)
我实际做的是以下,因为我找不到另一种方式:
private double _bpm;
private double _bps;
private double Bpm
{
set
{
_bpm = value;
_bps = _bpm / 60;
}
get
{
return _bpm;
}
}
Run Code Online (Sandbox Code Playgroud)
我发现它不优雅,有两个私人成员Bpm和_bpm.我也可以有一个SetBpm方法,但我想知道这是否可以用属性实现.
函数std::forward声明如下:
template< class T >
T&& forward( typename std::remove_reference<T>::type& t ) noexcept;
Run Code Online (Sandbox Code Playgroud)
这意味着它需要一个 type 的参数std::remove_reference<T>::type&。
但是,std::forward也可以与可变参数一起使用:
template <typename... Args>
void f(Args... args)
{
q(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
我了解可变参数模板并解压它们。
但是,我不明白...“在”调用之后的语法std::forward。
这个语法到底是什么意思?为什么有效?它可以与除 之外的功能一起使用std::forward吗?